java - getIntent() 上的空指针异常

标签 java android android-intent nullpointerexception

我想从第二个 Activity 中获取一个值,以便在单独的类(fragmentPageAdapter)中使用它。首先,使用 Intent.putExtra(key_name, string) 将这个值从我的主 Activity 传递到我的第二个 Activity 。因此,在我的第二个 Activity 中,我使用 getIntent().getStringExtra(key_name) 再次检索该值。但是,我想不在我的第二个 Activity 中使用这个特定值,而是在我的fragmentPageAdapter(这是一个单独的类)中使用。所以我想我在第二个 Activity 中使用 getter,以便我可以在我的 fragmetnPageAdapter 类中检索该值。但是我会得到一个空指针异常。

在我的第二个 Activity 中,我使用这个 setter/getter :

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

这就是我的fragmentPageAdapter 类的样子:

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...
}

}

空指针异常看起来像这样:

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)

现在奇怪的是,如果我将 getter 更改为下面的代码,它确实会按我的预期工作。

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

所以我认为检索“selectedItem”的数据出了问题。所以我确实使用了Toast注释(我想可以使用日志函数...)函数来打印出:getIntent().getStringExtra(“selectedItem”)。每当它打印在屏幕上时,我都会得到一个值为“ride_height”的字符串。谁能告诉我我在这里做错了什么,我将非常感激:)。

注意: 忽略公共(public) Fragment getItem() 函数中 if 语句的错误使用,这样编写只是为了测试。

编辑:

我认为我没有充分澄清我的问题。这是我的完整代码:

 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 由我的主要 Activity (带有 ListView 监听器)启动,代码如下:

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

我只是不明白为什么我得到返回 getIntent().getStringExtra("selectedItem");。希望这能为你们澄清一点。

最佳答案

MySecondActivity mySecondActivity = new MySecondActivity();

getIntent 返回用于启动 Activity 的 Intent,并且它永远不会为 null,但是当您尝试使用 new 运算符实例化 Activity 时。您永远不应该直接处理 Acitivity 对象,而应该始终依赖框架(查看 Activity 的生命周期)。

编辑

您可以向适配器构造函数添加第二个参数

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

和内部getItem

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

以及onCreate内部

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

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

关于java - getIntent() 上的空指针异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24897753/

相关文章:

android - 在Flutter文本中添加特殊字符如何在Flutter中显示文本中的特殊字符?

java - Android如何在android中获取两个时区之间的时差?

android - 为什么查询联系人选择器需要不同的权限,具体取决于 android 版本?

java - 将 Android studio 从 3.0 更新到 3.1 后抛出错误 'Cannot find the symbol variable'

Java GDAX 身份验证的 REST 请求 HTTP GET 错误 400

android - Android 4.2 (Jelly Bean) 设备支持低功耗蓝牙 (BLE)

android - 从android中的通话记录中访问最近错过的号码

java - 如何在两个 Android 应用程序之间创建交互

java - REST - 定义来自 Restful Java 服务的 JSON 数组的名称

java - 对我的代码执行输入验证的最有效方法是什么?