从另一个活动调用时为空侦听器

时间:2018-02-10 08:26:55

标签: java android nullpointerexception listener

在Android中,我正在尝试为第二个活动中的任务完成时设置一个回调侦听器。流程如下:

MainActivity Starts - >调用第二个活动 - >第二个活动完成呼叫监听器时 - >返回主要活动

我使用以下代码完成了此操作:

  //// First activity
  Main Activity {


      // Reference to second activity
  private IntroActivity mIntroActivity;

  @Override
  protected void onCreate(Bundle savedInstanceState) {

    /// Listener reference
    mIntroActivity = new IntroActivity();

    Intent i = new Intent(MainActivity.this, IntroActivity.class);
  startActivity(i);


      /// Call back for second activity
    mIntroActivity.setIntroListener(new IntroActivity.IntroListener() {
        @Override
        public void finished() {
          /// When finished do something!
        }

    });

  }
  }


  /// Second Activity

  public class IntroActivity extends AppIntro {

      /// Listener setup

    public interface IntroListener {
        void finished();
    }


    public void setIntroListener(IntroListener listener) {
        this.mIntroListen = listener;
    }

    public IntroActivity(){
        this.mIntroListen = null;
    }


    private IntroListener mIntroListen;



      @Override
  protected void onCreate(@Nullable Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);

    }

    @Override
  public void onDonePressed(Fragment currentFragment) {
      super.onDonePressed(currentFragment);

      /// Call listenr from MainActivity
      mIntroListen.finished();
  }



  }

向第二个活动添加接口侦听器。完成此活动后,调用finished()并返回MainActivity。

我得到的问题是mIntroListen.finished();在第二个活动中为null。

这里的任何想法都会很棒。我有相同的接口/监听器在另一个项目中工作(这是另一个不活动的类)所以我不确定什么是错的。

提前致谢!

4 个答案:

答案 0 :(得分:3)

  

我得到的问题是mIntroListen.finished();在第二个活动中为null。

您将始终获得null,因为mIntroActivity实例和IntroActivity的实际运行实例不同。

mIntroActivity = new IntroActivity();

以这种方式创建活动并不是一个好主意。要开始Activity,您应始终使用startActivity()

如果您希望使用MainActivity中的某些数据返回IntroActivity,或者在完成呼叫监听器时返回startActivityForResult(intent),则应使用MainActivity中的IntroActivity。此方法将为您提供设置MainActivity中找到的结果的选项,您可以使用onActivityResult() startActivityForResult(intent)方法将结果用于IntroActivity

对于您的案例,请使用IntroActivity启动您的onActivityResult(),当完成呼叫监听器刚刚完成MainActivity时,onActivityResult()将调用<cuppa-slidemenu [menulist]="menuItemsArray" [config]="config" (open)="onMenuOpen()" (close)="onMenuClose()" (onItemSelect)="onItemSelect($event)"> </cuppa-slidemenu> 方法。并在config

中做你想做的事

点击此官方链接Getting a Result from an Activity,您还可以查看此answer

答案 1 :(得分:2)

如果您仔细研究代码的以下部分,您会看到在创建Intent时,您正在通过IntroActivity.class。这意味着您只是传递Class引用,而不是该类的实例化对象。因此,当活动启动时,它没有引用您实例化的mIntroActivity。所以,显然introListener也是null。这是预期的行为。

/// Listener reference
mIntroActivity = new IntroActivity();

Intent i = new Intent(MainActivity.this, IntroActivity.class);
startActivity(i);

/// Call back for second activity
mIntroActivity.setIntroListener(new IntroActivity.IntroListener() {
    @Override
    public void finished() {
      /// When finished do something!
    }
});

要从已启动的活动中获取结果,您必须使用startActivityForResult(Intent intent)。有关详细信息,请查看documentation

修改后的代码如下所示。

MainActivity

private static final int INTRO_ACTIVITY_REQUEST_CODE = 771;

@Override
protected void onCreate(Bundle savedInstanceState) {

  Intent i = new Intent(MainActivity.this, IntroActivity.class);
  startActivityForResult(i, INTRO_ACTIVITY_REQUEST_CODE);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
    if (requestCode == INTRO_ACTIVITY_REQUEST_CODE) {
        if (resultCode == RESULT_OK) {
            String resultValue = data.getStringExtra("KEY");
        }
    }
}

IntroActivity

@Override
public void onDonePressed(Fragment currentFragment) {
  super.onDonePressed(currentFragment);

    Intent resultIntent = new Intent();
    resultIntent.putExtra("KEY", "VALUE");
    setResult(RESULT_OK, resultIntent); // RESULT_OK means success
    finish();
}

答案 2 :(得分:1)

你实际上并没有通过调用new来初始化第二个活动,甚至不是一个好主意。

我确信使用处理程序可以更好地完成工作,如下所示:

  1. MainActivity中声明一个处理程序并将其实例化如下:

    private Handler = new Handler(){
      public void handleMessage(Message message){
            // Do your jobs
      }}
    
  2. 使用Messenger

    将您的意图运送到第二个活动
    Intent intent = new Intent(this, SecondActivity.class);
    intent.putExtra("key_handler", new Messenger(handler));
    startActivity(intent);`
    
  3. 获取SecondActivity.class中的意图,并从中提取信使,当您的第二个活动完成其工作时,只需致电messenger.send(message)将消息发送回主要活动。

    Intent intent = getIntent();
    Messenger messenger = intent.getExtras("key_handler");
    // Do jobs .....
    // When done, call send method on messenger, maybe you want sth to sent             back to main activity, just use bundle.
    Message message = Message.obtainMessage();
    Bundle bundle = new Bundle();
    // Put sth in the bundle, then call setData()
    message.setData(bundle);
    messenger.send(message)`
    
  4. 返回handleMessage(Message message)抓取您的消息。

  5. 请注意,只有更简单的答案才会忽略上述某些内容,您必须自行搜索才能正确使用。

答案 3 :(得分:1)

查看startActivityForResult(Intent, Key)

的文档

您应该使用它来从其他活动中获取结果。

使用new()实例化活动是错误的。