ViewPager加载时无法为所有Fragment的EditText赋值求助
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
ETinstance and knows its position, soonResumesets 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

