簡體   English   中英

如何在ViewPager片段中更改視圖

[英]How to change views in ViewPager Fragment

我在活動中有一個帶有片段的ViewPager ,每個頁面都有一個textview ,我想從包含viewpager的活動中的onCreate方法更改textview的文本。 我應該怎么做呢?

以下是返回空對象異常的代碼:

分段:

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
}

謝謝!

大多數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 ,不會膨脹的新實例,因此具有null的textView引用。

另一個問題是,在活動的onCreate內,片段尚未膨脹,因此除非延遲調用,否則textView將為null:

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

但是,實際上,為什么不在初始化時將其設置為正確的值呢?

試試這個片段:

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);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM