up操作:获取有关父活动的意图数据[重复]

问题描述 投票:0回答:2

在我的应用程序中,单击向上操作时,我得到了Null Pointer Exception。导航正确发生在父活动上。然后转到父活动的onCreate方法。它期望来自意图的值,并且它为null。但不确定如何在按下的向上动作中设置意图值。任何帮助表示赞赏。

 Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Object android.os.Bundle.get(java.lang.String)' on a null object reference

活动1:

public class SignalListActivity extends AppCompatActivity {

public static final String EXTRA_CAT_ID = "sigcatid";
private DatabaseQuery dbQuery;
private Cursor cursor;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_signal_list);
    setTitle("Cat chat");
    try {
        Toolbar mToolbar = (Toolbar) findViewById(R.id.my_toolbar);
        setSupportActionBar(mToolbar);

        if(getSupportActionBar() != null){
            getSupportActionBar().setTitle("Signal List");

            getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        }
        dbQuery = new DatabaseQuery(SignalListActivity.this);
        final String cat = (String) getIntent().getExtras().get(EXTRA_CAT_ID);
        List<Signal> signals = dbQuery.getSignalsNew(cat);
        //getting recycler view

        RecyclerView signalRecycler =(RecyclerView)findViewById(R.id.signal_recycler);
        //GridLayoutManager mGrid = new GridLayoutManager(this, 2);
        LinearLayoutManager layoutManager = new LinearLayoutManager(this);
        layoutManager.setOrientation(LinearLayoutManager.VERTICAL);


        signalRecycler.setLayoutManager(layoutManager);
       // signalRecycler.setHasFixedSize(true);

        SignalAdapter mAdapter = new SignalAdapter(SignalListActivity.this, signals);
        signalRecycler.setAdapter(mAdapter);
        mAdapter.setListener(new SignalAdapter.Listener() {
            @Override
            public void onClick(long id) {
                Intent intent = new Intent(getApplicationContext(),SignalActivity.class);


                intent.putExtra(SignalActivity.EXTRA_SIG_ID, id);
                intent.putExtra(EXTRA_CAT_ID, cat);
                startActivity(intent);
            }

            /*public void onClick(int position) {
                Intent intent = new Intent(this, SignalActi.class);
                intent.putExtra(PizzaDetailActivity.EXTRA_PIZZA_ID, position);
                getActivity().startActivity(intent);
            }*/
        });





    } catch(SQLiteException e) {
        Toast toast = Toast.makeText(this, "Database unavailable", Toast.LENGTH_SHORT);
        toast.show();
    }

.....

活动2

public class SignalActivity extends AppCompatActivity {

public static final String EXTRA_SIG_ID = "signalId";
private DatabaseQuery dbQuery;
private Context context;
private String cat;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_signal);
    dbQuery = new DatabaseQuery(SignalActivity.this);
    Toolbar mToolbar = (Toolbar) findViewById(R.id.my_toolbar);
    setSupportActionBar(mToolbar);
    cat = (String) getIntent().getExtras().get(EXTRA_CAT_ID);
    if(getSupportActionBar() != null){
        getSupportActionBar().setTitle("Signal Details");

        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    }
    try {


        Long signalId = (Long) getIntent().getExtras().get(EXTRA_SIG_ID);

        Signal signal = dbQuery.getSignal(signalId);
        TextView name = (TextView)findViewById(R.id.name);
        name.setText(signal.getName());

        //Populate the drink description
        TextView description = (TextView)findViewById(R.id.description);
        description.setText(signal.getDescription());

        TextView teaser = (TextView)findViewById(R.id.teaser);
        teaser.setText(signal.getTeaser());

        //Populate the drink image
        ImageView photo = (ImageView)findViewById(R.id.photo);
        int photoId =  getResourseId(this,signal.getImage(), "drawable",getPackageName());

        photo.setImageResource(photoId);
        photo.setContentDescription(signal.getName());

    } catch(SQLiteException e) {
        Toast toast = Toast.makeText(this, "Database unavailable", Toast.LENGTH_SHORT);
        toast.show();
    }

...当从活动2单击向上按钮时,它将转到活动1的onCreate方法,并期望final String cat = (String) getIntent().getExtras().get(EXTRA_CAT_ID);

android nullpointerexception
2个回答
0
投票

如果您有2个活动

  1. 活动A
  2. 活动B

假设您现在在活动B中,当您按下返回按钮,导航回活动A时,您在活动A中的生命周期将输入OnResume()NOT onCreate(),因为您的Activity A仍在您的堆栈中,因此不需要再次重新创建活动。因此,您会得到空值,正如您期望的那样[回调,不幸的是不会发生。

为了解决这个问题,我们有3种选择:

1)为两个活动添加一个SharedViewModel,在此ViewModel中使用MutableLiveData,在

活动B

中添加数据,并在活动A中观察这些数据。2)在两个活动之间使用广播接收器或回调接口。

3)从

活动B

活动A开始新的Intent,并在onCreate()中接收数据

0
投票
更改这两行:

1)

getIntent().getStringExtra(EXTRA_CAT_ID);

代替

getIntent().getExtras().get(EXTRA_CAT_ID);

2)

getIntent().getLongExtra(EXTRA_SIG_ID,0);

代替

getIntent().getExtras().get(EXTRA_SIG_ID);

因为getIntent()。getExtras()为空

© www.soinside.com 2019 - 2024. All rights reserved.