在ViewPager中引用EditText会创建空指针异常

时间:2013-05-15 20:32:54

标签: android android-fragments nullpointerexception android-viewpager findviewbyid

我正在尝试做什么:

让用户在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);
        }
    }
}
}

4 个答案:

答案 0 :(得分:1)

有几件事:

  1. 活动中的EditTexts是否可能为null,因为您尝试在适配器创建所有片段及其视图之前(通过视图中的ID)引用它们?此外,似乎每次调用getItem的{​​{1}}方法时,都会创建一个具有自己视图的新片段...因此,当新的片段视图时,您的Activity可能会引用陈旧的EditText视图已创建。

  2. 您的活动不应该关注每个片段中存在的视图及其周围的逻辑。让每个片段处理对自己视图的引用并管理它们周围的逻辑会更好。您可以做的是拥有一个中央缓存,其中EditTexts值由片段存储/检索。例如,在ResultsPagerAdapter片段的onPause()方法中,您可以将其EditText值存储在缓存中,并且Swipe片段的onResume()方法可以将所有更新来自缓存的EditText值。

  3. 在适配器的switch语句中,您应该使用SwipeReviewResults块返回空的default,而不是不必要地预先创建它。

  4. 我希望这可以帮助你。

答案 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