在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。
这里的任何想法都会很棒。我有相同的接口/监听器在另一个项目中工作(这是另一个不活动的类)所以我不确定什么是错的。
提前致谢!
答案 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。
修改后的代码如下所示。
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");
}
}
}
@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来初始化第二个活动,甚至不是一个好主意。
我确信使用处理程序可以更好地完成工作,如下所示:
在MainActivity
中声明一个处理程序并将其实例化如下:
private Handler = new Handler(){
public void handleMessage(Message message){
// Do your jobs
}}
使用Messenger
Intent intent = new Intent(this, SecondActivity.class);
intent.putExtra("key_handler", new Messenger(handler));
startActivity(intent);`
获取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)`
返回handleMessage(Message message)
抓取您的消息。
请注意,只有更简单的答案才会忽略上述某些内容,您必须自行搜索才能正确使用。
答案 3 :(得分:1)