【问题标题】:Broadcast the method ArrayList.add from one Class to another Class with Intent使用 Intent 将方法 ArrayList.add 从一个类广播到另一个类
【发布时间】:2015-11-13 14:12:41
【问题描述】:

我尝试使用 Intent 将我的文本从 EditText 字段广播到使用 ArrayList 的微调器女巫。

一个类看起来像:

MainActivity.java

public class MainActivity extends AppCompatActivity {
ArrayList<String> server_name_list;
    ...
    ...
        spinner = (Spinner) findViewById(R.id.server_spinner);
    server_name_list = getIntent().getStringArrayListExtra("server_name_list");

    server_name_list = new ArrayList<String>();

    ArrayAdapter<String> server_adapter = new ArrayAdapter<String>(this,
            android.R.layout.simple_spinner_item, server_name_list);

    server_adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    spinner.setAdapter(server_adapter);

所以我尝试通过使用将新项目添加到我的 ArrayList 中

AddIP.java

public class AddIP extends AppCompatActivity {

ArrayList<String> server_name_list;
    ...
    ...
/* Add IP Button */
    btn_add = (Button)findViewById(R.id.btn_add);
    btn_add.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View view) {
    new_server_name = server_name.getText().toString();
    server_name_list.add(new_server_name);

它在同一个类中有效。 但是我有一个带有 EditText 字段的类和一个带有微调器的类(在 MainActivity.class 中)。

这里是 Intent 方法

 Intent intent = new Intent(AddIP.this, MainActivity.class);
 intent.putStringArrayListExtra("server_name_list", server_name_list);

但是,如果我单击“添加 IP”按钮,我的程序就会崩溃。 我做错了什么?

调试时的错误代码

11-13 15:19:27.875 7422-7422/de.kwietzorek.fulcrumwebview D/AndroidRuntime: Shutting down VM
    11-13 15:19:27.876 7422-7422/de.kwietzorek.fulcrumwebview E/AndroidRuntime: FATAL EXCEPTION: main
    11-13 15:19:27.876 7422-7422/de.kwietzorek.fulcrumwebview E/AndroidRuntime: Process: de.kwietzorek.fulcrumwebview, PID: 7422
    11-13 15:19:27.876 7422-7422/de.kwietzorek.fulcrumwebview E/AndroidRuntime: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.util.ArrayList.add(java.lang.Object)' on a null object reference
    11-13 15:19:27.876 7422-7422/de.kwietzorek.fulcrumwebview E/AndroidRuntime:     at de.kwietzorek.fulcrumwebview.AddIP$2.onClick(AddIP.java:49)
    11-13 15:19:27.876 7422-7422/de.kwietzorek.fulcrumwebview E/AndroidRuntime:     at android.view.View.performClick(View.java:5198)
    11-13 15:19:27.876 7422-7422/de.kwietzorek.fulcrumwebview E/AndroidRuntime:     at android.view.View$PerformClick.run(View.java:21147)
    11-13 15:19:27.876 7422-7422/de.kwietzorek.fulcrumwebview E/AndroidRuntime:     at android.os.Handler.handleCallback(Handler.java:739)
    11-13 15:19:27.876 7422-7422/de.kwietzorek.fulcrumwebview E/AndroidRuntime:     at android.os.Handler.dispatchMessage(Handler.java:95)
    11-13 15:19:27.876 7422-7422/de.kwietzorek.fulcrumwebview E/AndroidRuntime:     at android.os.Looper.loop(Looper.java:148)
    11-13 15:19:27.876 7422-7422/de.kwietzorek.fulcrumwebview E/AndroidRuntime:     at android.app.ActivityThread.main(ActivityThread.java:5417)
    11-13 15:19:27.876 7422-7422/de.kwietzorek.fulcrumwebview E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Native Method)
    11-13 15:19:27.876 7422-7422/de.kwietzorek.fulcrumwebview E/AndroidRuntime:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
    11-13 15:19:27.876 7422-7422/de.kwietzorek.fulcrumwebview E/AndroidRuntime:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

编辑

MainActivity.java

public class MainActivity extends AppCompatActivity {
...
...
 ArrayList<String> server_name_list;
...
...
 @Override
    protected void onCreate(Bundle savedInstanceState) {
...
 //Spinner
        spinner = (Spinner) findViewById(R.id.server_spinner);

        server_name_list = getIntent().getStringArrayListExtra("server_name_list");

        server_name_list = new ArrayList<String>();

        ArrayAdapter<String> server_adapter = new ArrayAdapter<String>(this,
                android.R.layout.simple_spinner_item, server_name_list);

        server_adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spinner.setAdapter(server_adapter);

AddIP.java

public class AddIP extends AppCompatActivity {

Button btn_back, btn_add;
EditText server_ip, server_name;
String new_server_ip, new_server_name;
ArrayList<String> server_name_list = new ArrayList<String>();

@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.add_ip);

    server_ip = (EditText)this.findViewById(R.id.edit_server_address);
    server_name = (EditText)this.findViewById(R.id.edit_server_name);

    /* Back Button */
    btn_back = (Button)findViewById(R.id.btn_back);
    btn_back.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View view) {
            Intent intent = new Intent(getApplicationContext(), MainActivity.class);
            startActivity(intent);
        }
    });

    /* Add IP Button */
    btn_add = (Button)findViewById(R.id.btn_add);
    btn_add.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View view) {
            /*new_server_ip = server_ip.getText().toString();
            MainActivity.server_array_ip.add(new_server_ip);*/

            new_server_name = server_name.getText().toString();

            server_name_list = new ArrayList<String>();
            server_name_list.add(new_server_name);

            Intent intent = new Intent(AddIP.this, MainActivity.class);
            intent.putStringArrayListExtra("server_name_list", server_name_list);
        }
    });
}

}

【问题讨论】:

  • 为什么会崩溃?你能提供任何堆栈跟踪吗?
  • @Kevin Esche 编辑了我的帖子
  • 你能在 AddIP 类中显示 server_name_list 的初始化吗?
  • @Nanoc 我已经尝试过 Aegis 的解决方案。但是我的 ArrayList 中没有新条目
  • 当然,那是创建一个新的空数组,你能把你的数据加载到你的数组列表中的代码贴出来吗?

标签: java android android-intent arraylist


【解决方案1】:

您应该使用 OTTO 事件总线将数据发送到其他活动,或者您可以将要编辑的数组列表设为静态,如下所示:

 public static ArrayList<String> server_name_list;

然后在onClick() 中访问它:

MainActivity.server_name_list.add(new_server_name);

然后通知适配器您要在哪里显示列表。

【讨论】:

    【解决方案2】:

    AddIP.java 中的 server_name_list 字段为空。

    应该是

    ArrayList<String> server_name_list = new Arraylist<String>;
    

    在类的顶部或在 onClick 方法中。

    @Override
    public void onClick(View view) {
        new_server_name = server_name.getText().toString();
        server_name_list = new Arraylist<String>;
        server_name_list.add(new_server_name);
    

    如果在 MainActivity 中,如果您在 server_name_list = getIntent().getStringArrayListExtra("server_name_list"); 之后删除 server_name_list = new ArrayList&lt;String&gt;();,arraylist 将填充可打包数据?

    更新:

    第一次崩溃可以很容易地调试。当某些事情崩溃时,请始终检查日志中的堆栈跟踪。在这种情况下,请始终检查日志以获取对您自己代码的最后引用,即at de.kwietzorek.fulcrumwebview.AddIP$2.onClick(AddIP.java:49)。指向第 49 行 AddIP 类中的 onClick 方法。错误消息java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.util.ArrayList.add(java.lang.Object)' on a null object reference 表示您正在调用一个对象上的方法,该对象为空,因此无法执行。这将转换对象server_name_list,即java.util.ArrayList 为空,应在使用前进行初始化。

    通过在启用调试器的情况下运行代码并在server_name_list 的第一个分配上设置断点,然后逐行逐行执行代码,可以轻松解决第二个问题。

    【讨论】:

    • 谢谢。现在应用程序不再崩溃了。但是我的 ArrayList 中没有新条目。
    • 也许你应该更好地调试你的代码,而不是立即拒绝一个答案。
    • 你可以看到我对你的回答投了反对票?我不...而且我是编码新手,很抱歉我什么都做不了
    • 抱歉,当我说否决票时有点胡思乱想。并立即开始点手指,这是我不应该做的。我还用更多信息更新了我的答案。
    猜你喜欢
    • 2019-07-04
    • 2012-03-06
    • 1970-01-01
    • 2021-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-07
    相关资源
    最近更新 更多