You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ViewPager加载时无法为所有Fragment的EditText赋值求助

Fix for ViewPager Fragment EditText Population Issues

Hey there, the core problem in your code is the use of static variables in your myFragment class. Static variables are shared across all instances of a class, so every time you create a new fragment, your static ET (EditText) gets overwritten with the latest fragment's EditText reference. That's why only the last fragment's EditText was being updated—all your code was pointing to that single shared instance.

Let's walk through the fixes step by step:

1. Remove Static Variables from myFragment

Replace static counter and ET with instance variables, and add a way for each fragment to know its position in the ViewPager.

Corrected myFragment Code:

public class myFragment extends Fragment {
    private EditText ET;
    private int mPosition;

    public myFragment() {
        // Required empty public constructor
    }

    // Pass position to fragment when creating it
    public static myFragment newInstance(int position) {
        myFragment fragment = new myFragment();
        Bundle args = new Bundle();
        args.putInt("position", position);
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (getArguments() != null) {
            mPosition = getArguments().getInt("position");
        }
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.activity_fragment, container, false);
        ET = view.findViewById(R.id.editText);
        return view;
    }

    @Override
    public void onResume() {
        super.onResume();
        // Set text based on this fragment's unique position
        switch(mPosition) {
            case 0:
                ET.setText("First Fragment");
                break;
            case 1:
                ET.setText("Second Fragment");
                break;
            case 2:
                ET.setText("Third Fragment");
                break;
            case 3:
                ET.setText("Fourth Fragment");
                break;
        }
    }

    // Public method to update EditText from outside the fragment
    public void setEditTextText(String text) {
        if (ET != null) {
            ET.setText(text);
        }
    }
}

2. Update the ViewPager Adapter to Pass Position

Modify your MyAdapter to pass the fragment position when creating each instance:

Corrected MyAdapter in ViewPager2:

class MyAdapter extends FragmentStatePagerAdapter {
    public MyAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int position) {
        // Pass position to each fragment
        return myFragment.newInstance(position);
    }

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

    @Override
    public CharSequence getPageTitle(int position) {
        switch (position) {
            case 0:
                return "Page Zero";
            case 1:
                return "Page One";
            case 2:
                return "Page Two";
            case 3:
                return "Page Three";
        }
        return null;
    }
}

3. Fix the ViewPager Page Change Listener

Instead of accessing a static ET, retrieve the actual fragment instance for the selected page and call our new setEditTextText method:

Corrected ViewPager2 Code:

public class ViewPager2 extends FragmentActivity {
    private android.support.v4.view.ViewPager viewPager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_view_pager2);
        viewPager = findViewById(R.id.pager); // Fixed missing R.id. reference here
        viewPager.setOffscreenPageLimit(4);
        viewPager.setAdapter(new MyAdapter(getSupportFragmentManager()));
        
        viewPager.addOnPageChangeListener(new android.support.v4.view.ViewPager.OnPageChangeListener() {
            @Override
            public void onPageSelected(int arg0) {
                populateTextView(arg0);
            }

            public void populateTextView(int arg0) {
                // Get the correct fragment instance for the selected page
                myFragment currentFragment = (myFragment) getSupportFragmentManager()
                        .findFragmentByTag("android:switcher:" + viewPager.getId() + ":" + arg0);
                
                if (currentFragment != null) {
                    switch(arg0) {
                        case 0:
                            currentFragment.setEditTextText("Zero");
                            break;
                        case 1:
                            currentFragment.setEditTextText("One");
                            break;
                        case 2:
                            currentFragment.setEditTextText("Two");
                            break;
                        case 3:
                            currentFragment.setEditTextText("Three");
                            break;
                    }
                }
            }

            @Override
            public void onPageScrolled(int arg0, float arg1, int arg2) {}

            @Override
            public void onPageScrollStateChanged(int arg0) {}
        });

        PagerTabStrip pagerTabStrip = findViewById(R.id.pager_tab_strip);
        pagerTabStrip.setDrawFullUnderline(true);
        pagerTabStrip.setTabIndicatorColor(Color.YELLOW);
    }

    // MyAdapter class here (as updated above)
}

4. Minor Cleanup in FirstActivity

You don't need a Handler to start the activity—onClick runs on the main thread already:

public void gotoEngine() {
    Intent homeSheet = new Intent(FirstActivity.this, ViewPager2.class);
    startActivity(homeSheet);
}

Why This Works:

  • Each fragment now has its own ET instance and knows its position, so onResume sets the correct text for each fragment.
  • When the page changes, we retrieve the exact fragment for that page and update its EditText directly, no more shared static references.

内容的提问来源于stack exchange,提问作者starcondition

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:07:42