【问题标题】:Return list from a Activity to Main Activity?将列表从活动返回到主活动?
【发布时间】:2018-10-12 11:50:53
【问题描述】:

我希望MainActivity 调用SecondActivity 并且SecondActivity 返回一个字符串列表。

我读过的每个答案都解释了如何将数据从MainActivity 传递到SecondActivity

我创建了一个 Activity 来计算内部网络中所有可能的 IP 并将它们保存到一个列表中。 我想将此列表传递给MainActivity。 你能给我一些链接或代码来解决我的问题吗? 我是 Android Studio 的新手,但我必须这样做。 这里是 MainActivity

的 sn-p 代码
 b1.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    boolean check_conn = false;
                    check_conn = checkInternetConnection();//check if you are on internet

                    if (check_conn){
                        //we have connection
                        // find the all the possible IPs
                        Intent intent = new Intent(MainActivity.this, rangeIP_test.class);
                        startActivity(intent);
                    }
                    else {
                        // do something annoying
                        Toast.makeText(MainActivity.this,
                                "We need Internet Connection!", Toast.LENGTH_LONG).show();
                    }
                }
            });

rangeIP_test 计算 IP 的活动

WifiManager my_wifi = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);
String subnet = getSubnetAddress(my_wifi.getDhcpInfo().gateway);
IPs = findIP(subnet);

public List<String> findIP(String subnet){
        List<String> all_IPs;// All IPs on network
        all_IPs = new ArrayList<>();

        for (int i=2; i<255; i++){
            String host = subnet + "." + i;

            all_IPs.add(host);
        }
        return all_IPs;
    }

【问题讨论】:

标签: android android-intent android-bundle


【解决方案1】:

启动活动rangeIP_test,得到如下结果(即主机字符串列表):

 Intent intent = new Intent(MainActivity.this, rangeIP_test.class);
 startActivityForResult(intent,RC_LIST_STRING);

MainActivity.java中将RC_LIST_STRING定义为这样的字段:

 private static final int RC_LIST_STRING = 10001;

像这样在MainActivity.java 中覆盖onActivityResult()

 @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        // Check which request we're responding to
        if (requestCode == RC_LIST_STRING) {
            // Make sure the request was successful
            if (resultCode == RESULT_OK) {
               // get the list of strings here
               ArrayList<String> myHosts = (ArrayList<String>) data.getSerializableExtra("myHosts"); // key must be matching 
               // do operations on the list
            }
        }
    }

rangeIP_test.java中,成功获取所有主机并将它们添加到列表中后,您可以将列表传递回任何活动(这里,MainActivity)启动当前活动(这里,rangeIP_test)像这样:

Intent intent = new Intent();
intent.putExtra("myHosts", (Serializable) IPs);
setResult(RESULT_OK, intent);
finish();

现在,您已经完成了rangeIP_test 活动,您将返回到MainActivity,并且由于您已经覆盖了onActivityResult(),您将在那里获得主机列表。

请记住,在此示例中,您将主机列表转换为序列化类型并将其传递给之前的活动。由于StringArrayList 已经实现了Serializable 接口,你将不会得到任何unable to marshal value error。 但是,在将模型对象传递给活动时,您需要先使模型类实现Serializable 接口,然后再如上进行。

更好的方法是将模型类转换为Parcelable,然后在活动之间传递数据。请参阅此link 了解更多信息。

【讨论】:

  • 首先,感谢您的详细解答和您的宝贵时间!非常感谢@Jay,我浪费了太多时间来寻找答案。谢谢!
  • 我必须在命令 intent.putExtra("myHosts", all_IPs);我遇到了一个错误,我尝试了 AS 建议的四种解决方案。当我使列表可序列化时它起作用。
  • @OrfeasKazepis 您可以编辑我的答案以删除上述错误吗?这样其他人就不会再遇到这个错误了。
【解决方案2】:

您可以直接将列表传递给intent extras

类似的东西

Intent intent = getIntent();  
intent.putStringArrayListExtra("test", (ArrayList<String>) all_IPs);

在另一个活动中,您可以像下面这样收到它

ArrayList<String> test = getIntent().getStringArrayListExtra("test");

【讨论】:

  • 我们需要使用 setResult(RESULT_OK, intent);也对吗?
【解决方案3】:

使用 startActivityForResult 和 onActivityResult 可能有效。

通过 startActivityForResult() 调用 rangeIP_test Activity 并通过 setResult() 返回您的列表。完成工作后不要忘记完成()。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-17
    • 2016-09-20
    • 2012-11-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多