Android 无法使用ViewPager和FragmentPagerAdapter访问片段视图
试着通过闲逛了解Android开发,所以如果查询太简单,请原谅 我有以下代码,由于NullPointerException而不断崩溃-我尝试了几种方法来访问片段的视图,但我总是得到null。谁能帮我解决我做错了什么 我试图做的是在滚动页面时将EditText的内容保存到SharedReferences。就我个人而言,我似乎无法访问在显示选项卡时加载的片段的视图Android 无法使用ViewPager和FragmentPagerAdapter访问片段视图,android,android-fragments,Android,Android Fragments,试着通过闲逛了解Android开发,所以如果查询太简单,请原谅 我有以下代码,由于NullPointerException而不断崩溃-我尝试了几种方法来访问片段的视图,但我总是得到null。谁能帮我解决我做错了什么 我试图做的是在滚动页面时将EditText的内容保存到SharedReferences。就我个人而言,我似乎无法访问在显示选项卡时加载的片段的视图 public class ViewPagerAdapter extends FragmentPagerAdapter { fi
public class ViewPagerAdapter extends FragmentPagerAdapter {
final int PAGE_COUNT = 3;
// Tab Titles
private String tabtitles[] = new String[] { "Profile", "Address",
"Security"};
Context context;
public ViewPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public int getCount() {
return PAGE_COUNT;
}
@Override
public Fragment getItem(int position) {
switch (position) {
// Open FragmentTab1.java
case 0:
CreateUserFragmentProfile fragmenttab1 = new
CreateUserFragmentProfile();
return fragmenttab1;
// Open FragmentTab2.java
case 1:
CreateUserFragmentLocation fragmenttab2 = new
CreateUserFragmentLocation();
return fragmenttab2;
// Open FragmentTab3.java
case 2:
CreateUserFragmentSecurity fragmenttab3 = new
CreateUserFragmentSecurity();
return fragmenttab3;
}
return null;
}
@Override
public CharSequence getPageTitle(int position) {
return tabtitles[position];
}
}
片段代码扩展了片段,几乎什么也不做
public class CreateUserFragmentSecurity extends Fragment {
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup
container, @Nullable Bundle savedInstanceState) {
//return super.onCreateView(inflater, container,
savedInstanceState);
View view = inflater.inflate(R.layout.create_fragment_security,
container, false);
return view;
}
public void storeData(){
}
}
活动代码如下:
public class CreateUser extends AppCompatActivity {
public SharedPreferences preferences;
public SharedPreferences.Editor editor;
public View currView;
public String fname, lname, dob, gender, email, addr1, addr2, addr3,
addrstate, city, passwd, passwdPlain;
public Long mobile, pin;
//public FragmentPagerAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_create_user);
preferences = getSharedPreferences("Reviv", MODE_PRIVATE);
editor = preferences.edit();
// Locate the viewpager in activity_create_user.xml
final ViewPager viewPager = (ViewPager) findViewById(R.id.pager);
// Set the ViewPagerAdapter into ViewPager
final FragmentPagerAdapter adapter = new
ViewPagerAdapter(getSupportFragmentManager());
viewPager.setAdapter(adapter);
viewPager.setOffscreenPageLimit(3);
viewPager.addOnPageChangeListener(new
ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset,
int positionOffsetPixels) {
boolean hasChanged = false;
switch (position){ // store data on tab switch
case 0: // Profile tab
//currView =
viewPager.getChildAt(viewPager.getCurrentItem()); // returns
null
currView =
adapter.getItem(viewPager.getCurrentItem()).getView(); //
crashes, returns null
EditText etFname =
currView.findViewById(R.id.etFname);
fname = etFname.getText().toString();
hasChanged = false;
if(!StringUtils.isEmpty(fname)) {
editor.putString("fname", fname);
hasChanged = true;
}
if(hasChanged == true) editor.commit();
break;
case 1: // Address tab
// currView =
viewPager.getChildAt(viewPager.getCurrentItem()); // returns
null
currView =
adapter.getItem(viewPager.getCurrentItem()).getView();
EditText etAddr1 =
currView.findViewById(R.id.etAddr1);
addr1 = etAddr1.getText().toString();
hasChanged = false;
if(!StringUtils.isEmpty(addr1)) {
editor.putString("addr1", addr1);
hasChanged = true;
}
if(hasChanged == true) editor.commit();
break;
case 2: // Security tab
//currView =
viewPager.getChildAt(viewPager.getCurrentItem()); // returns null
currView =
adapter.getItem(viewPager.getCurrentItem()).getView();
EditText etPasswd =
currView.findViewById(R.id.etPasswd);
passwd = etPasswd.getText().toString();
hasChanged = false;
if(!StringUtils.isEmpty(passwd)) {
editor.putString("passwd", passwd);
hasChanged = true;
}
if(hasChanged == true) editor.commit();
break;
}
}
@Override
public void onPageSelected(int position) {
// do nothing
}
@Override
public void onPageScrollStateChanged(int state) {
// do nothing
}
});
}
}
我的堆栈跟踪如下所示:
public class CreateUser extends AppCompatActivity {
public SharedPreferences preferences;
public SharedPreferences.Editor editor;
public View currView;
public String fname, lname, dob, gender, email, addr1, addr2, addr3,
addrstate, city, passwd, passwdPlain;
public Long mobile, pin;
//public FragmentPagerAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_create_user);
preferences = getSharedPreferences("Reviv", MODE_PRIVATE);
editor = preferences.edit();
// Locate the viewpager in activity_create_user.xml
final ViewPager viewPager = (ViewPager) findViewById(R.id.pager);
// Set the ViewPagerAdapter into ViewPager
final FragmentPagerAdapter adapter = new
ViewPagerAdapter(getSupportFragmentManager());
viewPager.setAdapter(adapter);
viewPager.setOffscreenPageLimit(3);
viewPager.addOnPageChangeListener(new
ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset,
int positionOffsetPixels) {
boolean hasChanged = false;
switch (position){ // store data on tab switch
case 0: // Profile tab
//currView =
viewPager.getChildAt(viewPager.getCurrentItem()); // returns
null
currView =
adapter.getItem(viewPager.getCurrentItem()).getView(); //
crashes, returns null
EditText etFname =
currView.findViewById(R.id.etFname);
fname = etFname.getText().toString();
hasChanged = false;
if(!StringUtils.isEmpty(fname)) {
editor.putString("fname", fname);
hasChanged = true;
}
if(hasChanged == true) editor.commit();
break;
case 1: // Address tab
// currView =
viewPager.getChildAt(viewPager.getCurrentItem()); // returns
null
currView =
adapter.getItem(viewPager.getCurrentItem()).getView();
EditText etAddr1 =
currView.findViewById(R.id.etAddr1);
addr1 = etAddr1.getText().toString();
hasChanged = false;
if(!StringUtils.isEmpty(addr1)) {
editor.putString("addr1", addr1);
hasChanged = true;
}
if(hasChanged == true) editor.commit();
break;
case 2: // Security tab
//currView =
viewPager.getChildAt(viewPager.getCurrentItem()); // returns null
currView =
adapter.getItem(viewPager.getCurrentItem()).getView();
EditText etPasswd =
currView.findViewById(R.id.etPasswd);
passwd = etPasswd.getText().toString();
hasChanged = false;
if(!StringUtils.isEmpty(passwd)) {
editor.putString("passwd", passwd);
hasChanged = true;
}
if(hasChanged == true) editor.commit();
break;
}
}
@Override
public void onPageSelected(int position) {
// do nothing
}
@Override
public void onPageScrollStateChanged(int state) {
// do nothing
}
});
}
}
java.lang.NullPointerException:尝试调用虚拟方法
空值上的“android.view.view android.view.view.findViewById(int)”
对象引用
在
com.portmanteau.revio.CreateUser$1.onPageScrolled(CreateUser.java:58)
在
android.support.v4.view.ViewPager.dispatchOnPageScrolled(ViewPager.java:1921)
在
android.support.v4.view.ViewPager.onPageScrolled(ViewPager.java:1895)
在android.support.v4.view.ViewPager.pageScrolled上(ViewPager.java:1833)
位于android.support.v4.view.ViewPager.scrollToItem(ViewPager.java:690)
位于android.support.v4.view.ViewPager.onLayout(ViewPager.java:1777)
在android.view.view.layout(view.java:19678)
位于android.view.ViewGroup.layout(ViewGroup.java:6057)
在
android.support.constraint.ConstraintLayout.onLayout(ConstraintLayout.java:1197)
在android.view.view.layout(view.java:19678)
位于android.view.ViewGroup.layout(ViewGroup.java:6057)
位于android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
位于android.widget.FrameLayout.onLayout(FrameLayout.java:261)
在android.view.view.layout(view.java:19678)
位于android.view.ViewGroup.layout(ViewGroup.java:6057)
在
android.support.v7.widget.ActionBarOverlayLayout.onLayout(ActionBarOverlayLayout.java:434)
在android.view.view.layout(view.java:19678)
位于android.view.ViewGroup.layout(ViewGroup.java:6057)
位于android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
位于android.widget.FrameLayout.onLayout(FrameLayout.java:261)
在android.view.view.layout(view.java:19678)
位于android.view.ViewGroup.layout(ViewGroup.java:6057)
位于android.widget.LinearLayout.setChildFrame(LinearLayout.java:1791)
位于android.widget.LinearLayout.layoutVertical(LinearLayout.java:1635)
位于android.widget.LinearLayout.onLayout(LinearLayout.java:1544)
在android.view.view.layout(view.java:19678)
位于android.view.ViewGroup.layout(ViewGroup.java:6057)
位于android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
位于android.widget.FrameLayout.onLayout(FrameLayout.java:261)
位于com.android.internal.policy.DecorView.onLayout(DecorView.java:758)
在android.view.view.layout(view.java:19678)
位于android.view.ViewGroup.layout(ViewGroup.java:6057)
在android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2510)
在android.view.ViewRootImpl.performTraversals上(ViewRootImpl.java:2219)
位于android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1405)
在
android.vie
adapter.getItem(viewPager.getCurrentItem()).getView();
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
boolean hasChanged = false;
if (positionOffset > 0) {
currView = getSupportFragmentManager().findFragmentByTag("android:switcher:" + R.id.pager + ":" + position).getView();
if (currView != null) {
EditText editText = null;
if (position == 0) editText = currView.findViewById(R.id.etPasswdPlain);
else if (position == 1) editText = currView.findViewById(R.id.etAddr1);
else if (position ==2) editText = currView.findViewById(R.id.etFname);
if (editText != null) {
String value = editText.getText().toString();
Log.d("TAG", "Value is " + value);
}
}
}
}