有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何使用意图在活动之间传递和操作对象

这是我关于Android Lifecycle的第一个问题,我感到有些无助:

在ActivityA中有onCreate。在这里,我创建了一个名为playerNames的ArrayList和一个名为moves的ArrayList。此外,oncreate中还发生了一些事情。在A的onStart中,我创建了一个标志,以便知道哪个活动正在运行,以防我想一次全部关闭。在onDestroy中,标志被设置回null

最后,我打算开始活动B,在那里我将移动列表带到一起。很好

现在我想让B回到A。当我尝试这样做时,生命周期会发生什么?显然,一旦调用了A的创建,就会导致一个NullPointerException,对playerNames列表进行重新排序

我想在B运行时存储这个ArrayList,当我回到A时将其取回。哪个方法是正确的(onResume?onRestart?)我该如何储存它?我真的需要共享参考资料吗

提前感谢你的帮助


共 (2) 个答案

  1. # 1 楼答案

    关于活动A:

    -创建意图,指定要开始的活动

    -将活动B收到的该意图的数据输入

    -开始活动以获得结果

    -在onActivityResult()上,验证您是否有要接收的数据,并对其执行所需操作

    关于活动B:

    -在onCreate()上接收活动A的数据

    -根据需要修改数据

    -创造新的意图

    -将数据放入意图中

    -设置活动结果和意图数据

    -完成活动B

    下面是我描述的步骤示例,它的作用是让活动a启动活动B,并向其传递一个空的ArrayList。然后在活动B上,填充arrayList并将其发送回活动A,在活动A中,arrayList的内容显示在屏幕上

    代码:

    活动A:

    private static final int REQUEST_LIST = 1;
    ArrayList<String> myList;
    TextView listText;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
        listText = (TextView) findViewById(R.id.mylist_text);
        myList = new ArrayList<String>();
    
        Intent i = new Intent(MainActivity.this, ActivityB.class);
        i.putExtra(ActivityB.EXTRA_ARRAY, myList);
        startActivityForResult(i, REQUEST_LIST);
    
    }
    
    @Override
    protected void
            onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
    
        if (resultCode != Activity.RESULT_OK) return;
    
        if (requestCode == REQUEST_LIST) {
            myList = (ArrayList<String>) data.getSerializableExtra(ActivityB.EXTRA_ARRAY);
    
            StringBuilder text = new StringBuilder();
            for (int j = 0; j < myList.size(); j++) {
                text.append(myList.get(j) + " ");
            }
    
            listText.setText(text.toString());
        }
    }
    

    活动B:

    public static final String EXTRA_ARRAY = "com.example.androidtest.mainactivity.array";
    
    ArrayList<String> myList;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activityb_layout);
        myList = (ArrayList<String>) getIntent().getSerializableExtra(EXTRA_ARRAY);
    
        for (int i = 0; i < 10; i++) {
            myList.add(String.valueOf(i));
        }
    
        Intent data = new Intent();
        data.putExtra(EXTRA_ARRAY, myList);
        setResult(Activity.RESULT_OK, data);
    
        finish();
    }
    

    注意:您不能忘记在清单文件中声明活动B。还要注意活动如何通过类中创建的常量知道要发送和收集哪些数据,这些数据必须是一致的,因此避免使用文字字符串,并使用定义的常量

  2. # 2 楼答案

    从活动B中,您可以使用以下方法返回到前一个A实例:

    Intent intent = new Intent(this, A.class);
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
    startActivity(intent);
    

    这将清除所有当前堆栈并返回到A实例(http://developer.android.com/reference/android/content/Intent.html#FLAG_ACTIVITY_CLEAR_TOP)。只要你的活动没有被破坏,你就拥有了所有的数据

    无论如何,您应该考虑使用Activity的保存实例状态能力(http://developer.android.com/reference/android/app/Activity.html#onSaveInstanceState%28android.os.Bundle%29)。