【问题标题】:Pass bundle whitout starting Activity在不启动 Activity 的情况下传递捆绑包
【发布时间】:2011-03-25 15:19:57
【问题描述】:

我需要将一个 ArrayList 传递给一个活动,所以我可以在那里列出它,但我不想立即开始那个活动。我需要在另一个“显示扫描的列表”按钮按下时开始列出活动。因为我想要传递的捆绑包上的按钮只包含一个finish(),当我准备好我的列表时,我用它返回我的主菜单,然后从那个菜单上我进入显示列表按钮。哪个开始另一项活动,我知道如何传递捆绑包的唯一方法是意图。但这会再次启动菜单活动。我希望有人能理解这个问题,我可能需要一些帮助。

谢谢你。

--编辑--

package org.example.sudoku;

import java.util.ArrayList;

import android.app.Activity;
import android.app.ListActivity;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.content.Intent;



public class Sudoku extends Activity implements OnClickListener {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);

     // Set up click listeners for all the buttons

        View exitButton = findViewById(R.id.exit_button);
        exitButton.setOnClickListener(this);
        View scanButton = findViewById(R.id.scan_button);
        scanButton.setOnClickListener(this);
        View editButton = findViewById(R.id.about_button);
        editButton.setOnClickListener(this);

    }
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.scan_button:
            Intent intent = new Intent("com.google.zxing.client.android.SCAN");
            intent.putExtra("com.google.zxing.client.android.SCAN.SCAN_MODE", "ONE_D_MODE");
            startActivityForResult(intent, 0);
        break;
        case R.id.about_button:
            ArrayList<String> scanList = new ArrayList<String>();
            scanList.add("asd");
            scanList.add("asd2");
            scanList.add("asd3");
            //String[] names = new String[] { "Linux", "Windows7", "Eclipse", "Suse", "Ubuntu", "Solaris", "Android", "iPhone"};
            Intent about = new Intent(this.getApplicationContext(),About.class);
            Bundle b = new Bundle();

            b.putStringArrayList("key", scanList);


            about.putExtras(b);
            startActivityForResult(about, 0);
        break;
        case R.id.exit_button:
            finish();
        break;


                    }
                }



    public void onActivityResult(int requestCode, int resultCode, Intent intent) {
        if (requestCode == 0) {
            if (resultCode == RESULT_OK) {
                String contents = intent.getStringExtra("SCAN_RESULT");
                // Handle successful scan
                Intent result = new Intent(this.getApplicationContext(),Result.class);
                Bundle b = new Bundle();
                b.putString("content",contents);
                result.putExtras(b);
                startActivityForResult(result, 0);



            } else if (resultCode == RESULT_CANCELED) {
                // Handle cancel
            }
        }
    }

}

这是我的主要活动。我不知道我是否理解正确,但我只需要另一个 public void onActivityResult(int requestCode, int resultCode, Intent intent) 来处理由 B 活动调用的完成的 C 活动? A 会知道标识符是 B 活动的原因吗? 我希望我明白了。

【问题讨论】:

    标签: android arraylist bundle


    【解决方案1】:

    因此,如果我理解您的问题,您会遇到以下情况。您有 Activity A 从中启动了 Activity B(在其中您生成所需的 ArrayList),然后您完成()活动 B 并从活动 A 开始使用生成的列表启动活动 C。 如果这是您的方案,最好的方法是使用活动结果。在活动 B 中调用 http://developer.android.com/reference/android/app/Activity.html#setResult(int, android.content.Intent),它接受捆绑并将 ArrayList 传递回活动 A。然后当您启动活动 C 时传递它。

    您必须通过调用http://developer.android.com/reference/android/app/Activity.html#startActivityForResult(android.content.Intent, int) 来启动Activity B 并在onActivityResult() 中处理结果

    【讨论】:

    • 我不知道你也可以发回Intent。太棒了!
    • 另外,+1 表示理解提问者。我没有。
    • 你说得对,但我忘了告诉其他事情,现在有 A 活动,它调用 B 活动,它是条形码扫描仪,它调用 C 活动,我可以看到扫描代码,我可以按下下一步或完成按钮,这个 C 活动正在处理数组列表,现在当我按下完成时,我回到 A 活动,而在显示列表中我想在我的 D 活动中查看扫描的列表。有什么不妥吗?
    • 是的,只需使用相同的方法。使用 setActivity result 将结果返回给最初启动您的活动。
    • developer.android 页面旁边有没有示例?因为我对android很陌生,谢谢你的回答。
    【解决方案2】:

    您需要重新考虑您的方法。您将无法在没有通过 onCreate(); 的情况下在 Activity 中“使用”ArrayList;听起来您需要另一个可以处理 ArrayList 的活动或类。

    【讨论】:

    • 啊,是的,我想到了这一点,所以当我调用我的活动时,arraylist 会再次创建,并且将为空?
    【解决方案3】:

    执行此操作的正确方法似乎是将您的列表作为额外的 FLAG_ACTIVITY_CLEAR_TOP 意图传递:

    Intent intent = new Intent(this, MainActivity.class);
    intent.putExtra("list", myList);
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    startActivity(intent);
    

    这会在您的用户按下按钮时发生。 FLAG_ACTIVITY_CLEAR_TOP 将完成MainActivity 之上的所有活动,因此您无需担心调用finish()。它还将重新启动MainActivity,您将在其onCreate 方法中读回您的数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-08-04
      • 1970-01-01
      • 1970-01-01
      • 2011-02-11
      • 2021-10-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多