我正在尝试做什么:
让用户在3个不同的片段上输入数据,然后在第4个片段上,用户将在提交到数据库之前查看输入前3个片段的所有数据。
我遇到的问题:
我尝试设置或从EditText中获取的每种方法都会创建NullPointerException
我的问题:
对于我正在尝试做的事情,从一个片段调用EditText的文本值的正确方法是什么,并且在页面更改时随时在另一个片段中的EditText中设置该文本?
备注:
我已将代码简化为仅在每个片段上反映一个EditText,以便于复制和轻松解析代码。
代码:
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.widget.EditText;
public class SwipeEnterResults extends FragmentActivity {
ResultsPagerAdapter mResultsPagerAdapter;
ViewPager mViewPager;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.swipe_enter_results);
mResultsPagerAdapter = new ResultsPagerAdapter(getSupportFragmentManager());
mViewPager = (ViewPager) findViewById(R.id.pager);
mViewPager.setAdapter(mResultsPagerAdapter);
}
public void onResume() {
super.onResume();
//Declare EditText(s)
final EditText txt1= (EditText) mViewPager.findViewById(R.id.txt1);
final EditText txt2= (EditText) mViewPager.findViewById(R.id.txt2);
final EditText txt3= (EditText) mViewPager.findViewById(R.id.txt3);
final EditText rvw1= (EditText) mViewPager.findViewById(R.id.rvw1);
final EditText rvw2= (EditText) mViewPager.findViewById(R.id.rvw2);
final EditText rvw3= (EditText) mViewPager.findViewById(R.id.rvw3);
mViewPager.setOnPageChangeListener(new OnPageChangeListener() {
@Override
public void onPageSelected(int position) {
rvw1.setText(txt1.getText().toString());
rvw2.setText(txt2.getText().toString());
rvw3.setText(txt3.getText().toString());
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) { }
@Override
public void onPageScrollStateChanged(int arg0) { }
});
}
public class ResultsPagerAdapter extends FragmentPagerAdapter{
public ResultsPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
Fragment f = new Fragment();
switch (position) {
case 0:
f = new Swipe1();
break;
case 1:
f = new Swipe2();
break;
case 2:
f = new Swipe3();
break;
case 3:
f = new SwipeReviewResults();
break;
}
return f;
}
@Override
public int getCount() {
return 4;
}
@Override
public CharSequence getPageTitle(int position) {
switch (position) {
case 0:
return getString(R.string.str1);
case 1:
return getString(R.string.str2);
case 2:
return getString(R.string.str3);
case 3:
return getString(R.string.strReview);
default:
return "Page " + (position + 1);
}
}
}
}
答案 0 :(得分:1)
有几件事:
活动中的EditTexts是否可能为null,因为您尝试在适配器创建所有片段及其视图之前(通过视图中的ID)引用它们?此外,似乎每次调用getItem
的{{1}}方法时,都会创建一个具有自己视图的新片段...因此,当新的片段视图时,您的Activity可能会引用陈旧的EditText视图已创建。
您的活动不应该关注每个片段中存在的视图及其周围的逻辑。让每个片段处理对自己视图的引用并管理它们周围的逻辑会更好。您可以做的是拥有一个中央缓存,其中EditTexts值由片段存储/检索。例如,在ResultsPagerAdapter
片段的onPause()
方法中,您可以将其EditText值存储在缓存中,并且Swipe
片段的onResume()
方法可以将所有更新来自缓存的EditText值。
在适配器的switch语句中,您应该使用SwipeReviewResults
块返回空的default
,而不是不必要地预先创建它。
我希望这可以帮助你。
答案 1 :(得分:0)
不要让EditText
决赛。请尝试使用以下代码代替您当前的onResume
:
EditText txt1= (EditText) mViewPager.findViewById(R.id.txt1);
EditText txt2= (EditText) mViewPager.findViewById(R.id.txt2);
EditText txt3= (EditText) mViewPager.findViewById(R.id.txt3);
EditText rvw1= (EditText) mViewPager.findViewById(R.id.rvw1);
EditText rvw2= (EditText) mViewPager.findViewById(R.id.rvw2);
EditText rvw3= (EditText) mViewPager.findViewById(R.id.rvw3);
答案 2 :(得分:0)
你的ViewPager可能没有带有ids R.id.txt1,R.id.rvw1,...的
的EditTexts。确保您已在swipe_enter_results.xml文件中定义了所有EditTexts。否则一些对象(可能全部)将等于null并且您将获得NullPointerException。
答案 3 :(得分:0)
我最后尝试了几件事。我添加了mViewPager.setOffscreenPageLimit(3);
,然后将我的代码放在条件为if
的{{1}}语句中,这似乎解决了我在nullpointerexception中遇到的所有问题。谢谢大家的帮助!
position == 3