使用Intent将方法ArrayList.add从一个Class广播到另一个Class

时间:2015-11-13 14:12:42

标签: java android android-intent arraylist

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

一堂课如下:

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);
        }
    });
}

}

2 个答案:

答案 0 :(得分:-1)

您应该使用OTTO Event Bus将数据发送到其他活动,或者您可以将要编辑的arraylist设置为静态,如下所示:

 public static ArrayList<String> server_name_list;

然后在onClick()中将其作为:

进行访问
MainActivity.server_name_list.add(new_server_name);

然后通知适配器您要显示列表的位置。

答案 1 :(得分:-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 = new ArrayList<String>();后删除server_name_list = getIntent().getStringArrayListExtra("server_name_list");,那么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表示您正在调用Object上的方法,该方法为null,因此无法执行。哪个会翻译server_name_list对象java.util.ArrayList为空,应该在使用之前进行初始化。

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