参考的EditText在ViewPager创建空指针异常 [英] Reference to EditText in ViewPager creates null pointer exception

查看:366
本文介绍了参考的EditText在ViewPager创建空指针异常的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图做的事:

让用户输入数据在3个不同的片段,然后在4片段用户将审核输入到第一3个片段的所有数据提交给数据库之前

我遇到的问题:

每次我试图设置或从EditText上的获得方法创​​建一个 NullPointerException异常

我的问题:

有关我想要做的,什么是呼吁从一个片段一个EditText的文本值,并设置文本一个EditText在另一个片段随时页面被更改正确的方法?

注:

我已经简化了code下降到仅反射一种EditText上的每个片段,易于复制和便于解剖code的。

code:

 进口android.os.Bundle;
进口android.support.v4.app.Fragment;
进口android.support.v4.app.FragmentActivity;
进口android.support.v4.app.FragmentManager;
进口android.support.v4.app.FragmentPagerAdapter;
进口android.support.v4.view.ViewPager;
进口android.support.v4.view.ViewPager.OnPageChangeListener;
进口android.widget.EditText;公共类SwipeEnterResults扩展FragmentActivity {ResultsPagerAdapter mResultsPagerAdapter;
ViewPager mViewPager;公共无效的onCreate(捆绑savedInstanceState){
    super.onCreate(savedInstanceState);
    的setContentView(R.layout.swipe_enter_results);    mResultsPagerAdapter =新ResultsPagerAdapter(getSupportFragmentManager());
    mViewPager =(ViewPager)findViewById(R.id.pager);
    mViewPager.setAdapter(mResultsPagerAdapter);
}公共无效onResume(){
    super.onResume();
    //声明的EditText(S)    最终的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);
    mViewPager.setOnPageChangeListener(新OnPageChangeListener(){
        @覆盖
        公共无效使用onPageSelected(INT位置){            rvw1.setText(txt1.getText()的toString());
            rvw2.setText(txt2.getText()的toString());
            rvw3.setText(txt3.getText()的toString());
        }
        @覆盖
        公共无效onPageScrolled(INT为arg0,ARG1浮球,诠释ARG2){}
        @覆盖
        公共无效onPageScrollStateChanged(INT为arg0){}
    });
}公共类ResultsPagerAdapter扩展FragmentPagerAdapter {    公共ResultsPagerAdapter(FragmentManager FM){
        超(FM);
    }    @覆盖
    公共片段的getItem(INT位置){
        片f =新的片断();        开关(位置){
        情况下0:
            F =新Swipe1();
            打破;
        情况1:
            F =新Swipe2();
            打破;
        案例2:
            F =新Swipe3();
            打破;
        案例3:
            F =新SwipeReviewResults();
            打破;
        }        返回F;
    }    @覆盖
    公众诠释的getCount(){
        返回4;
    }    @覆盖
    公共CharSequence的getPageTitle(INT位置){
        开关(位置){
        情况下0:
            返回的getString(R.string.str1);
        情况1:
            返回的getString(R.string.str2);
        案例2:
            返回的getString(R.string.str3);
        案例3:
            返回的getString(R.string.strReview);
        默认:
            回归页面+(位置+ 1);
        }
    }
}
}


解决方案

最后我想有两件事情。我加了 mViewPager.setOffscreenPageLimit(3); ,然后只把我的code在具有一个如果语句位置== 3 和条件似乎已经解决了我的NullPointerException异常的所有问题。感谢大家的帮助!

 进口android.os.Bundle;
进口android.support.v4.app.Fragment;
进口android.support.v4.app.FragmentActivity;
进口android.support.v4.app.FragmentManager;
进口android.support.v4.app.FragmentPagerAdapter;
进口android.support.v4.view.ViewPager;
进口android.support.v4.view.ViewPager.OnPageChangeListener;
进口android.widget.CheckBox;
进口android.widget.EditText;公共类SwipeEnterResults扩展FragmentActivity {ResultsPagerAdapter mResultsPagerAdapter;
ViewPager mViewPager;//声明的EditText对片段SwipeReviewResults审查数据
的EditText TXT1;
的EditText rvw1;
的EditText TXT2;
的EditText rvw2;
的EditText txt3;
的EditText rvw3;公共无效的onCreate(捆绑savedInstanceState){
    super.onCreate(savedInstanceState);
    的setContentView(R.layout.swipe_enter_results);    //设置ViewPager并允许应用程序来关闭屏幕时,应举行之前的网页
    mResultsPagerAdapter =新ResultsPagerAdapter(getSupportFragmentManager());
    mViewPager =(ViewPager)findViewById(R.id.pager);
    mViewPager.setAdapter(mResultsPagerAdapter);
    mViewPager.setOffscreenPageLimit(3);    //当显示SwipeReviewResults,填写的EditText与其他碎片数据
    mViewPager.setOnPageChangeListener(新OnPageChangeListener(){
        @覆盖
        公共无效使用onPageSelected(INT位置){            如果(位置== 3){
                //设定值EditTexts拉在SwipeReviewResults 3项片段数据和显示
                的EditText TXT1 =(EditText上)mViewPager.findViewById(R.id.txt1);
                的EditText rvw1 =(EditText上)mViewPager.findViewById(R.id.rvw1);
                的EditText TXT2 =(EditText上)mViewPager.findViewById(R.id.txt2);
                的EditText rvw2 =(EditText上)mViewPager.findViewById(R.id.rvw2);
                的EditText txt3 =(EditText上)mViewPager.findViewById(R.id.txt3);
                的EditText rvw3 =(EditText上)mViewPager.findViewById(R.id.rvw3);
                在SwipeReviewResults //设置的EditText的
                rvw1.setText(txt1.getText()的toString());
                rvw2.setText(txt2.getText()的toString());
                rvw3.setText(txt3.getText()的toString());            }
        }
        @覆盖
        公共无效onPageScrolled(INT为arg0,ARG1浮球,诠释ARG2){}
        @覆盖
        公共无效onPageScrollStateChanged(INT为arg0){}
    });
}公共类ResultsPagerAdapter扩展FragmentPagerAdapter {    公共ResultsPagerAdapter(FragmentManager FM){
        超(FM);
    }    @覆盖
    公共片段的getItem(INT位置){
        片段F;        开关(位置){
        情况下0:
            F =新Swipe1();
            打破;
        情况1:
            F =新Swipe2();
            打破;
        案例2:
            F =新Swipe3();
            打破;
        案例3:
            F =新SwipeReviewResults();
            打破;
        默认:
            F =新的片断();
            打破;
        }        返回F;
    }    @覆盖
    公众诠释的getCount(){
        返回4;
    }    @覆盖
    公共CharSequence的getPageTitle(INT位置){
        开关(位置){
        情况下0:
            返回的getString(R.string.str1);
        情况1:
            返回的getString(R.string.str2);
        案例2:
            返回的getString(R.string.str3);
        案例3:
            返回的getString(R.string.strReview);
        默认:
            回归页面+(位置+ 1);
        }
    }
}
}

What I'm trying to do:

Have users input data on 3 different fragments, then on the 4th fragment the user will review all data input into the first 3 fragments before submitting to a database.

The issue I'm having:

Every method I've tried to set or get from the EditText's creates a NullPointerException

My question:

For what I'm trying to do, what is the correct method to call for the text value of an EditText from one fragment, and set that text in an EditText in another fragment anytime a page is changed?

Notes:

I've simplified the code down to only reflect one EditText on each fragment for ease of replication and for ease of dissecting code.

Code:

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);
        }
    }
}
}

解决方案

I ended up trying a couple things. I added mViewPager.setOffscreenPageLimit(3); and then just put my code in an if statement with a condition of position == 3 and that seems to have solved all my issues with the nullpointerexception. Thanks everyone for the help!

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.CheckBox;
import android.widget.EditText;

public class SwipeEnterResults extends FragmentActivity {

ResultsPagerAdapter mResultsPagerAdapter;
ViewPager mViewPager;

//Declare EditText for reviewing data on Fragment SwipeReviewResults
EditText txt1;
EditText rvw1;
EditText txt2;
EditText rvw2;
EditText txt3;
EditText rvw3;

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.swipe_enter_results);

    //Set up ViewPager and allow app to hold prior pages when off screen
    mResultsPagerAdapter = new ResultsPagerAdapter(getSupportFragmentManager());
    mViewPager = (ViewPager) findViewById(R.id.pager);      
    mViewPager.setAdapter(mResultsPagerAdapter);
    mViewPager.setOffscreenPageLimit(3);

    //When SwipeReviewResults is displayed, fill EditText's with data from other fragments
    mViewPager.setOnPageChangeListener(new OnPageChangeListener() {
        @Override
        public void onPageSelected(int position) {

            if (position == 3) {
                //set values to EditTexts to pull data from 3 entry fragments and display in SwipeReviewResults
                EditText txt1 = (EditText) mViewPager.findViewById(R.id.txt1);
                EditText rvw1 = (EditText) mViewPager.findViewById(R.id.rvw1);
                EditText txt2 = (EditText) mViewPager.findViewById(R.id.txt2);
                EditText rvw2 = (EditText) mViewPager.findViewById(R.id.rvw2);
                EditText txt3 = (EditText) mViewPager.findViewById(R.id.txt3);
                EditText rvw3 = (EditText) mViewPager.findViewById(R.id.rvw3);


                //Set EditText's on SwipeReviewResults
                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;

        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;
        default:
            f = new Fragment();
            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);
        }
    }
}
}

这篇关于参考的EditText在ViewPager创建空指针异常的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆