2015-11-06 112 views
1

我有一个片段在ViewPager我的活动,每一页都有一个textview,我想了textview的文本从onCreate方法中包含viewpager活动而改变。我应该怎么做呢?如何更改视图ViewPager片段

下面

是,将返回一个空对象异常的代码:

片段:

public class MyFragment extends Fragment { 

private TextView textView; 

public static MyFragment getInstance(){ 
    return new MyFragment(); 
} 

@Nullable 
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    View rootView = inflater.inflate(R.layout.fragment_layout, container, false); 

    textView = (TextView) rootView.findViewById(R.id.textView); 

    return rootView; 
} 

public void setText(String text){ 
    textView.setText(text); 
} 
} 

适配器:

public class ViewPagerAdapter extends FragmentPagerAdapter { 

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

@Override 
public Fragment getItem(int position) { 
    return MyFragment.getInstance(); 
} 

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

活动的onCreate:

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

    ViewPager viewPager = (ViewPager) findViewById(R.id.view_pager); 
    final ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager()); 
    viewPager.setAdapter(adapter); 

    MyFragment fragment = (MyFragment) adapter.getItem(0); 
    fragment.setText("Altered");  // and this returns null pointer exception 
} 

谢谢你!

+0

因为你的片段仍然没有'attached',所以'onCreateView'仍不调用并且你的'TextView'为空。有关更多信息,请参见[片段生命周期](https://dzone.com/articles/visualization-android-activity)。 – NamNH

+0

那么我应该如何去改变文本或从主要活动中检查textview的状态? (也可以看看) – TPWang

+0

请试试这个[教程](https://guides.codepath.com/android/ViewPager-with-FragmentPagerAdapter) – NamNH

回答

1

大多数FragmentPagerAdapter旨意有一个addFragment方法,将让那些通过内部对象添加到它的轨道不同的片段:

public class MyPagerAdapter extends FragmentPagerAdapter { 
    private final List<Fragment> mFragments = new ArrayList<>(); 
    private final List<String> mFragmentTitles = new ArrayList<>(); 

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

    public void addFragment(Fragment fragment, String title) { 
     mFragments.add(fragment); 
     mFragmentTitles.add(title); 
    } 

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

    @Override 
    public int getCount() { 
     return mFragments.size(); 
    } 

    @Override 
    public CharSequence getPageTitle(int position) { 
     return mFragmentTitles.get(position); 
    } 
} 

既然这样,你的getItem实现返回MyFragment每一个新实例它被称为时间。因此,MyFragment fragment = (MyFragment) adapter.getItem(0);是一个永远不会加载到ViewPager中的新实例,永远不会被夸大,因此具有空值textView引用。

的另一个问题是,你的活动onCreate内,该片段尚未膨胀,所以,除非你耽误呼叫的textView将是无效的:

final MyFragment fragment = (MyFragment) mPagerAdapter.getItem(0); 
Handler handler = new Handler(); 
handler.postDelayed(new Runnable() { 
    @Override 
    public void run() { 
     fragment.setText("Altered"); 
    } 
}, 100); 

不过说真的,为什么不设置它初始化时的正确值?

0

试试这个 片段:

public class MyFragment extends Fragment { 

private TextView textView; 
private String Text; 
public MyFragment (String Text){ 
    this.Text=Text; 
} 

@Nullable 
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container,  Bundle savedInstanceState) { 
    View rootView = inflater.inflate(R.layout.fragment_layout, container, false); 

    textView = (TextView) rootView.findViewById(R.id.textView); 
    textView.setText(Text); 
    return rootView; 
} 

} 

适配器:

public class ViewPagerAdapter extends FragmentPagerAdapter { 

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

@Override 
    public Fragment getItem(int position) { 
    return new MyFragment("Altered"); 
} 

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

活动的onCreate:

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

    ViewPager viewPager = (ViewPager) findViewById(R.id.view_pager); 
    final ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager()); 
    viewPager.setAdapter(adapter); 
}