【问题标题】:Passing a Boolean ArrayList and a String ArrayList to the next Activity将 Boolean ArrayList 和 String ArrayList 传递给下一个 Activity
【发布时间】:2018-10-02 07:31:53
【问题描述】:

我想将 ArrayList<String>ArrayList<Boolean> 传递给我的下一个活动,但无论我尝试什么,它似乎总是用我的第二个 ArrayList 覆盖我的第一个 ArrayList。即使我使用布尔数组而不是 ArrayList,也会出现同样的问题。 KEY 不同,值也不同。我已经尝试了很多东西(不记得全部),包括捆绑包,但同样的事情一直在发生。我做错了什么?

在这两种情况下(以及许多其他情况),数据返回 null。

编辑:睡了一晚后清理了代码,因为我注意到其中确实存在一些错误。另外,我尝试了这两种方法,但都不起作用。

在活动 1 中:

boolean [] checksDataOut;
private ArrayList<String> data = new ArrayList();

intent.putStringArrayListExtra(EXTRA_TODEVICES, data);
intent.putExtra(EXTRA_TO_DEVICES, checksDataOut);
startActivity(intent);

在活动 2 中

public class DevicesInfo extends AppCompatActivity {

public ArrayList<String> data = new ArrayList();
public boolean [] checksDataIn;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_devices_info);
    Intent intent = getIntent();
    data = intent.getStringArrayListExtra(EXTRA_TODEVICES);
    checksDataIn = intent.getBooleanArrayExtra(EXTRA_TO_DEVICES);
    }
}

在活动 1 中:

private ArrayList<String> data = new ArrayList();
boolean [] checksDataOut;

Bundle extrasOut = new Bundle();
extrasOut.putStringArrayList(EXTRA_TODEVICES, data);
extrasOut.putBooleanArray(EXTRA_TO_DEVICES, checksDataOut);
intent.putExtras(extrasOut);
startActivity(intent);

在活动 2 中:

public class DevicesInfo extends AppCompatActivity {

public ArrayList<String> data = new ArrayList();
public ArrayList<Boolean> checksData = new ArrayList();

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_devices_info);
    Intent intent = getIntent();
    Bundle bundle = intent.getExtras();
    data = bundle.getStringArrayList(EXTRA_TODEVICES);
    checksData = (ArrayList<Boolean>) bundle.get(EXTRA_TO_DEVICES);
    }
}

【问题讨论】:

  • 在代码中,您将变量 checksDataOut 添加到包中,但您声明的变量是 checksData checksDataOut 是什么?
  • 在读取 tge 值时使用获取意图对象的代码更新您的问题。
  • checksDataOut 是一个布尔数组(见第一行代码)。在其余的代码中,数据将被填充到其中。
  • getBooleanArrayExtra 读取的是数组,而不是列表

标签: java android arraylist


【解决方案1】:

就个人而言,我更喜欢将该变量放在主活动中,该活动只有在我关闭程序时才会消失。我把它作为一个公共静态变量放在那里。因此,当我启动一个新活动时,我只是指示它从变量 onCreateonResume 中检索数据。我知道有些人可能会说,这是糟糕的编程。至少我可以有效地控制内容。

在基础 Activity:或 Activity1 中创建这些静态字段:

public static ArrayList<String> data;
public static ArrayList<Boolean> checksData;

在调用 Activity2 之前,更新这 2 个变量。

然后正常调用Activity2

随着Activity2被创建或恢复,需要数据的地方,调用Activity1中的数据,像这样Activity1.data;如果您想使用 checksData,请调用 Activity1.checksData

【讨论】:

  • 您能否提供更多关于 onCreate 如何工作的详细信息?
  • 它们不是常量。它们只是公共静态的,可以在不创建对象的情况下访问。
【解决方案2】:

首先,如果您打算使用getBooleanArray,您需要使用pass a boolean[] 而不是列表来pass a boolean[]

其次,如果找不到,则为空。目前尚不清楚您的常量在哪里定义,但它们必须相同,因此在调试时尝试使用常规字符串。

放置

boolean[] checksDataOut;
...
Bundle extrasOut = new Bundle();
extrasOut.putBooleanArray("boolArray", checksDataOut);
intent.putExtras(extrasOut);
// or intent.putExtra("boolArray", checksDataOut);
startActivity(intent);

得到

public boolean[] checksDataIn;
...
Intent intent = getIntent();
checksDataIn = intent.getBooleanArrayExtra("boolArray");

如果仍然为空,则放置一个断点或将 Bundle 的全部内容记录到 logcat。

【讨论】:

  • 当我尝试调试时,我发现我可以发送字符串数组列表或布尔数组,但我不能同时发送。
  • 我建议不要将你的两个常量命名得如此紧密。你可能有错别字
猜你喜欢
  • 2017-01-25
  • 2016-01-14
  • 2015-06-07
  • 2014-03-13
  • 1970-01-01
  • 2013-01-25
  • 1970-01-01
  • 2021-05-06
  • 1970-01-01
相关资源
最近更新 更多