【问题标题】:In Android Studio, cannot invoke Activity B from Activity A more than once在 Android Studio 中,不能多次从 Activity A 调用 Activity B
【发布时间】:2016-01-21 02:56:08
【问题描述】:

在我上一篇文章的基础上,我现在想从主活动中调用子活动多次。在我的真实项目中(与下面的 noddy 测试相反),当调用子活动时,它的标题显示,“输入第一个数据集”然后邀请用户输入一些数据。这些数据实际上存储在一个公共类中,而不是返回给主活动。然后需要用新的提示“输入第二个数据集”再次调用孩子,同样的事情也会发生。 我无法解决的是如何做到这一点。如果我对孩子进行两次呼叫,则每次似乎只发生第二次呼叫,每次出现在孩子活动中的提示都是“输入第二个数据集”。我相信这个 startActivityForResult() 方法被设计用于当你想调用一个活动并等待结果时使用(你用 onActivityResult() 做的不是),但它不会等待。

我到底该怎么做呢?示例代码如下。

感谢任何可以清楚地解释我哪里出错以及正确的代码应该是什么的人。

MainActivity 代码提取

@Override
public void onResume(){
    super.onResume();
    TextView maintop = (TextView)findViewById(R.id.maintop);
    maintop.setText(Common.mess1);
}

@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Button mainbutton = (Button)findViewById(R.id.mainbutton);

    mainbutton.setOnClickListener(new View.OnClickListener()
    {
        @Override
        public void onClick(View view)
        {
            Intent intent1 = new Intent(MainActivity.this,Child.class);
            intent1.putExtra("Prompt", "Enter first data set");
            startActivityForResult(intent1,1);
            onActivityResult(1,1,intent1);
        }

    });

    mainbutton.setOnClickListener(new View.OnClickListener()
    {
        @Override
        public void onClick(View view)
        {
            Intent intent2 = new Intent(MainActivity.this,Child.class);
            intent2.putExtra("Prompt", "Enter second data set");
            startActivityForResult(intent2,1);
            onActivityResult(1,1,intent2);
        }
    });
}

【问题讨论】:

    标签: java android android-activity android-studio


    【解决方案1】:

    按钮中只能有一个单击侦听器,因此当您第二次调用 set 时,它会替换侦听器。 您需要做的是为输入的第一个数据设置点击侦听器,不要调用 onActivityResult(1,1,intent1) 这不是您的操作方式,您需要覆盖该方法,并在 onActivityResult 调用第二个。 像这样的:

    static final int FIRST_INTENT = 1;
    static final int SECOND_INTENT = 2;
    
    @Override
    protected void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    
    Button mainbutton = (Button)findViewById(R.id.mainbutton);
    
    mainbutton.setOnClickListener(new View.OnClickListener()
    {
        @Override
        public void onClick(View view)
        {
            Intent intent1 = new Intent(MainActivity.this,Child.class);
            intent1.putExtra("Prompt", "Enter first data set");
            startActivityForResult(intent1,FIRST_INTENT);
        }
    
    });
    }
    
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == FIRST_INTENT) {
            if (resultCode == RESULT_OK) {
                Intent intent2 = new Intent(MainActivity.this,Child.class);
                intent2.putExtra("Prompt", "Enter second data set");
                startActivityForResult(intent2,SECOND_INTENT);
            }
        }
    }
    

    在你的孩子活动中

    //DO SOMETHING
    ....
    setResult(RESULT_OK)
    finish();
    }
    

    更多检查 [http://developer.android.com/intl/es/training/basics/intents/result.html] [http://developer.android.com/intl/es/reference/android/app/Activity.html#setResult%28int%29]

    【讨论】:

    • 太棒了,isma31。您的解决方案第一次工作(除了我必须将“FIRST_INTENT”和“SECOND_INTENT”分别更改为“1 和 2”)。现在,实际上,我希望能够执行此操作 2 或 3 次。我尝试添加另一个@Override protected void 等,但无法让它工作,因为系统告诉我它已经定义了。那么执行此操作 3 次甚至更多的一般解决方案是什么?(例如“输入第三个数据集”等.) 如果您能多花几分钟时间,我将不胜感激。谢谢。
    • @John of York “那么,执行 3 次甚至更多次的一般解决方案是什么?” 您应该使用 THIRD_INTENTFORTH_INTENT 等。然后在 @ 987654327@ 检查条件以获得正确的requestCode 并以相应的Intent 的额外内容开始Child
    • 谢谢你们(isma3l 和 Onik)。我现在明白了。我刚刚在 onActivityResult 添加了“if (requestCode == 22 etc.),它似乎工作正常。
    猜你喜欢
    • 2017-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多