NullPointerException异常上getIntent() [英] Nullpointerexception on getIntent()

查看:222
本文介绍了NullPointerException异常上getIntent()的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想从我的第二个活动的价值在一个单独的类(fragmentPageAdapter)来使用它。起初,这个值是从我的主要活动使用Intent.putExtra(KEY_NAME,字符串)传递给我的第二个活动。所以在我的第二个活动,我与getIntent()。getStringExtra(KEY_NAME)再次检索该值。不过,我想用我的不是第二个活动里,但在我fragmentPageAdapter这是一个单独的类此特定值。所以我想我用一个吸我的第二个活动里面,这样我可以检索我的fragmetnPageAdapter类此值。不过,我会得到一个NullPointerException异常。

在我的第二个活动我使用此getter:

 公共字符串getMyItem(){
    返回getIntent()getStringExtra(selectedItem设置);
}

这是我的fragmentPageAdapter类的样子:

 类myPagerAdapter扩展FragmentPagerAdapter {
MySecondActivity mySecondActivity =新MySecondActivity();
公共myPagerAdapter(FragmentManager FM){
    超(FM);
}@覆盖
公共片段的getItem(int i)以{
    片段片段= NULL;
    如果(mySecondActivity.getMyItem()。等于(ride_height)){
        如果(我== 0){
            片段=新fragment_ride_height_overview();
        }
        如果(ⅰ== 1){
            片段=新fragment_ride_height_measure();
        }
        如果(ⅰ== 2){
            片段=新fragment_ride_height_adjust();
        }
    }
    返回片段;
}@覆盖
公众诠释的getCount(){
    返回3; //这里还没有实现?
}

}

该NullPointerException异常是这样的:

 显示java.lang.NullPointerException
        在com.example.offroad_set_up_guide.MySecondActivity.getMyItem(MySecondActivity.java:73)
        在com.example.offroad_set_up_guide.myPagerAdapter.getItem(MySecondActivity.java:86)

现在奇怪的是,如果我改变吸气到下面的code,它的工作如我所料。

 公共字符串getMyItem(){
    返回ride_height
}

所以我想的东西与检索则selectedItem的数据脚麻。所以,我没有用吐司注释(可能已经使用了日志功能,我想...)函数打印出:getIntent()getStringExtra(selectedItem设置)。每当这是印在屏幕上,我会做得到与ride_height的值的字符串。谁能告诉我我在做什么错在这里,真的AP preciate它。)

请注意:
忽略了不好用,如果市民片段的getItem()函数中的语句,这是写这种方式只是用于测试的缘故。

编辑:

我想我没有澄清我的问题就好了。这是我的全code:

 公共类MySecondActivity扩展FragmentActivity实现ActionBar.TabListener {    动作条动作条;
    ViewPager viewPager;    @覆盖
    公共无效的onCreate(捆绑savedInstanceState){
        super.onCreate(savedInstanceState);
        的setContentView(R.layout.main_2);
        viewPager =(ViewPager)findViewById(R.id.viewPager);
        viewPager.setAdapter(新myPagerAdapter(getFragmentManager()));
        viewPager.setOnPageChangeListener(新ViewPager.OnPageChangeListener(){
            @覆盖
            公共无效onPageScrolled(INT I,浮动V,INT I2){
            }            @覆盖
            公共无效使用onPageSelected(int i)以{
                actionBar.setSelectedNavigationItem(ⅰ);
            }            @覆盖
            公共无效onPageScrollStateChanged(int i)以{            }
        });        动作条= getActionBar();
        如果(动作条!= NULL){
            actionBar.setDisplayShowHomeEnabled(假);
            actionBar.setDisplayShowTitleEnabled(假);
            actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
            清单<串GT; tabNames =新的ArrayList<串GT;();
            tabNames.addAll(getIntent()getStringArrayListExtra(tabNames));
            对于(字符串TABNAME:tabNames){
               actionBar.addTab(actionBar.newTab()
                                         .setText(TABNAME)
                                         .setTabListener(本));
            }
        }
    }
    @覆盖
    公共无效onTabSelected(ActionBar.Tab选项卡,FragmentTransaction fragmentTransaction){
        viewPager.setCurrentItem(tab.getPosition());    }
    @覆盖
    公共无效onTabUnselected(ActionBar.Tab选项卡,FragmentTransaction fragmentTransaction){    }    @覆盖
    公共无效onTabReselected(ActionBar.Tab选项卡,FragmentTransaction fragmentTransaction){    }    公共字符串getMyItem(){
        返回getIntent()getStringExtra(selectedItem设置);
        //回归ride_height
    }
}类myPagerAdapter扩展FragmentPagerAdapter {
    MySecondActivity mySecondActivity =新MySecondActivity();
    公共myPagerAdapter(FragmentManager FM){
        超(FM);
    }    @覆盖
    公共片段的getItem(int i)以{
        片段片段= NULL;
        如果(mySecondActivity.getMyItem()。等于(ride_height)){
            如果(我== 0){
                片段=新fragment_ride_height_overview();
            }
            如果(ⅰ== 1){
                片段=新fragment_ride_height_measure();
            }
            如果(ⅰ== 2){
                片段=新fragment_ride_height_adjust();
            }
        }
        返回片段;
    }    @覆盖
    公众诠释的getCount(){
        返回3; //这里还没有实现?
    }
}

MySecondActivity是由我的主要活动有以下code启动(使用一个ListView听众):

 意向意图=新意图(getBaseContext(),MySecondActivity.class);
            intent.putExtra(将selectedItem,ride_height);
            intent.putStringArrayListExtra(tabNames,tabNames.get(ⅰ).getTabNames());
            startActivity(意向);

我只是不明白为什么我得到一个回报getIntent()。getStringExtra(selectedItem设置);.希望这将澄清有点为你们。


解决方案

  MySecondActivity mySecondActivity =新MySecondActivity();

getIntent 返回用于启动该活动的意图,它永远不能为null,但是当你尝试实例化活动与新的运营商。你不应该有活性的研究对象直接打交道,你应该永远依靠的框架(看看该活动的生命周期)。

修改

您可以在第二参数添加到适配器构造

 类myPagerAdapter扩展FragmentPagerAdapter {
    私人字符串MITEM;
    公共myPagerAdapter(FragmentManager FM,串项){
        超(FM);
        MITEM =项目;
    }

和里面的的getItem

 如果(ride_height.equals(MITEM)){

和里面的onCreate

 新myPagerAdapter(getFragmentManager(),getIntent()。getStringExtra(selectedItem设置))

请注意,让您的适配器返回null将可能使你的应用程序崩溃。

I want to get a value from my second activity to use it in a separate class (a fragmentPageAdapter). At first this value is passed from my main activity to my second activity using Intent.putExtra(key_name, string). So in my second activity I am retrieving this value again with getIntent().getStringExtra(key_name). However I want to use this specific value not inside my second activity but in my fragmentPageAdapter which is a separate class. So I thought I use an getter inside my second activity so that I can retrieve this value in my fragmetnPageAdapter class. However I'll get an nullpointerexception.

Inside my second activity I am using this getter:

public String getMyItem(){
    return getIntent().getStringExtra("selectedItem");
}

this is how my fragmentPageAdapter class looks like:

class myPagerAdapter extends FragmentPagerAdapter {
MySecondActivity mySecondActivity = new MySecondActivity();
public myPagerAdapter(FragmentManager fm) {
    super(fm);
}

@Override
public Fragment getItem(int i) {
    Fragment fragment = null;
    if(mySecondActivity.getMyItem().equals("ride_height")){
        if(i==0){
            fragment = new fragment_ride_height_overview();
        }
        if(i==1){
            fragment = new fragment_ride_height_measure();
        }
        if(i==2){
            fragment = new fragment_ride_height_adjust();
        }
    }
    return fragment;
}

@Override
public int getCount() {
    return 3; //nothing implemented here yet...
}

}

the nullpointerexception looks like this:

java.lang.NullPointerException
        at com.example.offroad_set_up_guide.MySecondActivity.getMyItem(MySecondActivity.java:73)
        at com.example.offroad_set_up_guide.myPagerAdapter.getItem(MySecondActivity.java:86)

Now the weird thing is, if I change the getter to the code below, it does work as I expect.

public String getMyItem(){
    return "ride_height";
}

So I thought something is going wrong with retrieving the data of the "selectedItem". So I did use the Toast annotation (could have used the log function I suppose...) function to print out the: getIntent().getStringExtra("selectedItem"). And whenever this is printed on the screen I'll do get a string with a value of "ride_height". Can anybody tell me what I'm doing wrong here, would really appreciate it :).

NOTE: Ignore the bad use of if statements inside the public Fragment getItem() function, this was wrote this way just for the sake of testing.

EDIT:

I think I did not clarify my question enough. This is my full code:

 public class MySecondActivity extends FragmentActivity implements ActionBar.TabListener {

    ActionBar actionBar;
    ViewPager viewPager;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_2);
        viewPager = (ViewPager) findViewById(R.id.viewPager);
        viewPager.setAdapter(new myPagerAdapter(getFragmentManager()));
        viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int i, float v, int i2) {
            }

            @Override
            public void onPageSelected(int i) {
                actionBar.setSelectedNavigationItem(i);
            }

            @Override
            public void onPageScrollStateChanged(int i) {

            }
        });

        actionBar = getActionBar();
        if (actionBar != null) {
            actionBar.setDisplayShowHomeEnabled(false);
            actionBar.setDisplayShowTitleEnabled(false);
            actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
            List<String> tabNames = new ArrayList<String>();
            tabNames.addAll(getIntent().getStringArrayListExtra("tabNames"));
            for (String tabName : tabNames) {
               actionBar.addTab(actionBar.newTab()
                                         .setText(tabName)
                                         .setTabListener(this));
            }
        }
    }
    @Override
    public void onTabSelected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {
        viewPager.setCurrentItem(tab.getPosition());

    }
    @Override
    public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {

    }

    @Override
    public void onTabReselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {

    }

    public String getMyItem(){
        return getIntent().getStringExtra("selectedItem");
        //return "ride_height";
    }
}

class myPagerAdapter extends FragmentPagerAdapter {
    MySecondActivity mySecondActivity = new MySecondActivity();
    public myPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int i) {
        Fragment fragment = null;
        if(mySecondActivity.getMyItem().equals("ride_height")){
            if(i==0){
                fragment = new fragment_ride_height_overview();
            }
            if(i==1){
                fragment = new fragment_ride_height_measure();
            }
            if(i==2){
                fragment = new fragment_ride_height_adjust();
            }
        }
        return fragment;
    }

    @Override
    public int getCount() {
        return 3; //nothing implemented here yet...
    }
}

MySecondActivity is started by my main activity (with a listview listener) with the following code:

Intent intent = new Intent(getBaseContext() , MySecondActivity.class);
            intent.putExtra("selectedItem", "ride_height");
            intent.putStringArrayListExtra("tabNames", tabNames.get(i).getTabNames());
            startActivity(intent);

I just don't understand why I get an return getIntent().getStringExtra("selectedItem");. Hope this will clarify it a bit for you guys.

解决方案

MySecondActivity mySecondActivity = new MySecondActivity();

getIntent returns the intent used to start the Activity, and it is never null, but when you try to instantiate the Activity with the new operator. You should never deal directly with Acitivity object, and you should always rely on the framework (take a look to the activity's lifecycle).

Edit

You could add a second parameter to the adapter constructor

class myPagerAdapter extends FragmentPagerAdapter {
    private String mItem;
    public myPagerAdapter(FragmentManager fm, String item) {
        super(fm);
        mItem = item;
    }

and inside getItem

if("ride_height".equals(mItem)) {

and inside onCreate

new myPagerAdapter(getFragmentManager(), getIntent().getStringExtra("selectedItem"))

Please be aware that making your adapter returning null will probably make your application crash

这篇关于NullPointerException异常上getIntent()的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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