java - 如何在 ViewPager Fragment 中更改 View

标签 java android android-fragments android-viewpager adapter

我有一个 ViewPager 在我的 Activity 中有 fragment ,每个页面都有一个 textview,我想改变 textview 的文本从包含 viewpager 的 Activity 中的 onCreate 方法。我应该怎么做?

下面是返回空对象异常的代码:

fragment :

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

创建时的 Activity :

@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 方法,并将跟踪通过内部对象添加到其中的各种 fragment :

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 引用。

另一个问题是,在您的 Activity 的 onCreate 中, fragment 尚未膨胀,因此除非您延迟调用,否则 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);

但实际上,为什么不在初始化时将其设置为正确的值呢?

关于java - 如何在 ViewPager Fragment 中更改 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33558403/

相关文章:

android - 根据 Android Sharesheet 中选择的应用程序将特定文本共享到另一个应用程序

Android 慢 GridView

Android:无法让 YouTube Player API 在 fragment 内工作

java - 如何交换列表中的项目?

java - ClassNotFoundException 打击 XMPPConnection

java - 将树保存为预购

基于 Java 的库,提供特定长度的素数

Android:Camera2 在后置摄像头和前置摄像头之间切换

android - 如何查看android静态库的ABI?

android - fragment 中的条码扫描器