1

我的目标是主要活动中的init视图,但是我得到了nullpointerexception。 这里我的示例代码:在使用ViewPager时初始化片段视图的正确方法是什么?

public class MainActivity extends SherlockFragmentActivity { 
    private static final String TAG = "MainActivity"; 

    Fragment one, two, three; 
    List<Fragment> fragments; 
    ViewPager pager; 
    private MyPagerAdapter mPagerAdapter; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     initialisePaging(); 
     initTwo(); 
    } 

    private void initialisePaging() { 
     Log.d(TAG, "initialisePaging"); 
     fragments = new Vector<Fragment>(); 
     one = Fragment.instantiate(getApplicationContext(), One.class.getName()); 
     two = Fragment.instantiate(getApplicationContext(), Two.class.getName()); 
     three = Fragment.instantiate(getApplicationContext(), Three.class.getName()); 
     fragments.add(one); 
     fragments.add(two); 
     fragments.add(three); 
     mPagerAdapter = new MyPagerAdapter(getSupportFragmentManager(), fragments) ; 
     pager = (ViewPager) findViewById(R.id.trinity_viewpager); 
     pager.setAdapter(mPagerAdapter); 
    } 

    private void initTwo(){ 
     View twoView = mPagerAdapter.getItem(1).getView(); 
     TextView twoTv = (TextView) twoView.findViewById(R.id.frag_two_tv); 
     twoTv.setText("2!!!!"); 
    } 

    class MyPagerAdapter extends FragmentStatePagerAdapter { 
     private List<Fragment> fragments; 

     public MyPagerAdapter(FragmentManager fm, List<Fragment> fragments) { 
      super(fm); 
      this.fragments = fragments; 

     } 

     @Override 
     public Fragment getItem(int position) { 
      return fragments.get(position); 
     } 

     @Override 
     public int getCount() { 
      return 3; 
     } 
    } 
} 

片段一,二和三只包含textViews。我尝试初始化这些意见,并得到了 NullPointerException异常:

E/AndroidRuntime(2104): Caused by: java.lang.NullPointerException 
E/AndroidRuntime(2104):  at ru.alxr.viewpagerapp.MainActivity.initTwo(MainActivity.java:53) 
E/AndroidRuntime(2104):  at ru.alxr.viewpagerapp.MainActivity.onCreate(MainActivity.java:34) 
E/AndroidRuntime(2104):  at android.app.Activity.performCreate(Activity.java:5008) 
E/AndroidRuntime(2104):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079) 
E/AndroidRuntime(2104):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023) 
+0

回头看,这样一个可怕的代码 – Aleksandr

回答

0

修订 我发现的方式来解决问题。 的simpliest方法是通经由接口争夺:

这里是适配器:

static class MyPagerAdapter extends FragmentPagerAdapter { 
    public static MyPagerAdapter instance = null; 
    public static MyPagerAdapter getInstance(FragmentManager fm){ 
     if (instance == null) instance = new MyPagerAdapter(fm); 
     return instance; 
    } 

    public MyPagerAdapter(FragmentManager fm) { 
     super(fm); 
    } 

    @Override 
    public Fragment getItem(int position) { 
    Fragment r = null; 
     switch (position){ 
     default : break; 
     case 0 : { 
      r = One.newInstance(); 
      break; 
      } 

     case 1 : { 
      r = Two.newInstance(); 
      break; 
      } 
     case 2 : { 
      r = Three.newInstance(); 
      break; 
      } 
     } 
    return r; 
    } 

    @Override 
    public int getCount() { 
     return 3; 
    } 
} 

和片段之一:

public final class One extends SherlockFragment { 
     ViewOneCreated viewOneCreated; 
     static One one; 
     Button button; 
     ExpandableListView someListView; 

    Map <String, Object> classOneObjects; 

    private static final String  
      FRAGMENT = "FRAGMENT", 
      LISTVIEW = "LISTVIEW", 
      BUTTON = "BUTTON"; 

    public interface ViewOneCreated{ 
     public void fragmentOneCreated(Map <String, Object> classOneObjects); 
    } 

     @Override 
     public void onAttach(Activity activity) { 
     super.onAttach(activity); 
      try { 
       viewOneCreated = (ViewOneCreated) activity; 
      } catch (ClassCastException e) { 
       throw new ClassCastException(activity.toString() + " must implement onSomeEventListener"); 
      } 
     } 

     public static One instance() { 
      if (one == null) one = new One(); 
      return one; 
     } 

    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View baseView = inflater.inflate(R.layout.one_fragment, null); 
     button = (Button) baseView.findViewById(R.id.fragment_one_translate_button); 
     someListView= (ExpandableListView) baseView.findViewById(R.id.one_fragment_exp_list_view); 
     return baseView; 
     } 

    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     } 

    public void onViewCreated(View view, Bundle savedInstanceState){ 
     super.onViewCreated(view, savedInstanceState); 
     classOneObjects = new TreeMap<String, Object>(); 
     classOneObjects .put(FRAGMENT, (SherlockFragment) this); 
     classOneObjects .put(BUTTON, button); 
     classOneObjects .put(LISTVIEW, someListView); 
     viewOneCreated.fragmentOneCreated(classOneObjects); 
    } 
//... 
} 
2

尝试使用findViewById之前充气视图。

相关问题