在使用ViewPager时初始化片段视图的正确方法是什么?
问题描述:
我的目标是主要活动中的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)
答
修订 我发现的方式来解决问题。 的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);
}
//...
}
答
尝试使用findViewById之前充气视图。
回头看,这样一个可怕的代码 – Aleksandr