【问题标题】:Call Method - Android Studio调用方法 - Android Studio
【发布时间】:2016-03-31 09:34:26
【问题描述】:

我基本上是在尝试从另一个活动中获取信息。因此,我需要调用该活动。我用;

Adduser adduser = new AddUser();

但是当我添加它时,应用程序一直强制关闭?有什么想法吗?

主活动;

public class MainActivity extends AppCompatActivity{

 //AddUser adduser = new AddUser(); // HERE

   // private Realm realm;
   // private RealmConfiguration realmConfig;
Button btnadd;
ListView listuser;
ArrayList<String> list = new ArrayList<String>();
ArrayAdapter<String> adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //overridePendingTransition(R.anim.abc_fade_in, R.anim.abc_fade_out);
    setContentView(R.layout.activity_main);
  //  RealmConfiguration config = new RealmConfiguration.Builder(this).build();
   // Realm.setDefaultConfiguration(config);
    //getNames();

    //Add User Button
    btnadd = (Button) findViewById(R.id.btnAdd);
    listuser = (ListView) findViewById(R.id.listUser);
   // adduser.txtName = (EditText) findViewById(R.id.txtName);
    adapter =new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, android.R.id.text1, list);
    listuser.setAdapter(adapter);

    //Button Event
    btnadd.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (v == btnadd) {
                Intent addUser = new Intent(getApplicationContext(), AddUser.class);
                startActivityForResult(addUser,1);
            }
        }
    });
}
/*void getNames()
{
    list.add(adduser.txtName.getText().toString());
}*/
@Override
protected  void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == 1 && resultCode == RESULT_OK && data != null) {
        adapter.add(data.getStringExtra("name"));
        adapter.notifyDataSetChanged();
    }
}
}

添加用户:

public class AddUser extends AppCompatActivity {
Button btnback, btnsave;
EditText txtName, txtEmail, txtPhone, txtAddress;
String n1;
int no1;
Realm realm1;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.adduser);
   // Realm realm = Realm.getInstance(this);
    //EditText
    txtName=(EditText)findViewById(R.id.txtName);
    txtEmail=(EditText)findViewById(R.id.txtEmail);
    txtPhone=(EditText)findViewById(R.id.txtPhone);
    txtAddress=(EditText)findViewById(R.id.txtAddress);
    //Button
    btnback =(Button) findViewById(R.id.btnBack);
    btnsave = (Button)findViewById(R.id.btnSave);
    //Button Event
    btnback.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if(v == btnback){
                Intent main = new Intent(getApplicationContext(), MainActivity.class);
                startActivity(main);
            }
        }
    });

    btnsave.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (v == btnsave) {

                Intent result = new Intent();
                result.putExtra("name",txtName.getText().toString());
                setResult(RESULT_OK, result);

                Log.v("Name", txtName.getText().toString());
                Log.v("Email", txtEmail.getText().toString());
                Log.v("Phone", txtPhone.getText().toString());
                Log.v("Address", txtAddress.getText().toString());
//main.list.add(txtName.getText().toString());
                //UPDATE
                /*realm1.beginTransaction();
                //Saves the input data
               User user = realm1.createObject(User.class);
               user.setName(txtName.getText().toString());
               user.setAddress(txtAddress.getText().toString());
               user.setEmail(txtEmail.getText().toString());
               n1 = txtPhone.getText().toString();
               no1 = Integer.parseInt(n1);
                //COMMIT
               realm1.commitTransaction();
               */
                Toast.makeText(AddUser.this, "User has been added.", Toast.LENGTH_LONG).show();

                //Start Activity
                Intent save = new Intent(getApplicationContext(), MainActivity.class);
                startActivity(save);

            }
        }
    });
}

}

日志:

03-31 09:38:26.030 2831-2831/? E/AndroidRuntime: FATAL EXCEPTION: main
                                             Process: com.example.scott.addressbook, PID: 2831
                                             java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.scott.addressbook/com.example.scott.addressbook.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'android.text.Editable android.widget.EditText.getText()' on a null object reference
                                                 at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2298)
                                                 at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360)
                                                 at android.app.ActivityThread.access$800(ActivityThread.java:144)
                                                 at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278)
                                                 at android.os.Handler.dispatchMessage(Handler.java:102)
                                                 at android.os.Looper.loop(Looper.java:135)
                                                 at android.app.ActivityThread.main(ActivityThread.java:5221)
                                                 at java.lang.reflect.Method.invoke(Native Method)
                                                 at java.lang.reflect.Method.invoke(Method.java:372)
                                                 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
                                                 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
                                              Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.text.Editable android.widget.EditText.getText()' on a null object reference
                                                 at com.example.scott.addressbook.MainActivity.getNames(MainActivity.java:51)
                                                 at com.example.scott.addressbook.MainActivity.onCreate(MainActivity.java:30)
                                                 at android.app.Activity.performCreate(Activity.java:5937)
                                                 at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105)
                                                 at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2251)
                                                 at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360) 
                                                 at android.app.ActivityThread.access$800(ActivityThread.java:144) 
                                                 at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278) 
                                                 at android.os.Handler.dispatchMessage(Handler.java:102) 
                                                 at android.os.Looper.loop(Looper.java:135) 
                                                 at android.app.ActivityThread.main(ActivityThread.java:5221) 
                                                 at java.lang.reflect.Method.invoke(Native Method) 
                                                 at java.lang.reflect.Method.invoke(Method.java:372) 
                                                 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) 
                                                 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) 
03-31 09:38:26.060 941-941/? E/EGL_emulation: tid 941: eglCreateSyncKHR(1237): error 0x3004 (EGL_BAD_ATTRIBUTE)

我注意到了这一点:
原因:java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法 'android.text.Editable android.widget.EditText.getText()'

空对象?

我搜索了谷歌,每个人都说这就是这样做的方法?对一些简单的事情有点困惑,哈哈。提前致谢!

【问题讨论】:

  • 你能发布你的 logcat 输出,特别是崩溃的堆栈跟踪吗?
  • 现在肯定会得到日志——我基本上是在制作一个“地址簿”,我想显示用户的输入(他们的名字),然后在列表视图中显示它。 AddUser 是允许用户输入其姓名的类。
  • 可能是由于 'getNames()' 方法中的这行代码 'adduser.txtName.getText()' 导致的错误。你在某处初始化了“adduser.txtName”吗?
  • @KapilRajput 也许......如果我在 'getNames' 方法中添加 'List.add("test") 它适用于列表视图,但我试图显示用户的输入,如果这可以理解吗?所以我试图从“AddUser”类中获取它,而 txtName 是 .xml 上输入文本的名称,用户可以在其中输入他们的名字。这就是为什么我认为 .txtName.getText().toString();会抓取我所追求的数据。
  • 看来AddUser Activity。不建议手动实例化Activity

标签: android android-studio


【解决方案1】:

您似乎想从AddUser 获取用户的输入。

首先,在按钮的OnClickListener中,使用startActivityForResult而不是startActivity

btnadd.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        if (v == btnadd) {
            Intent addUser = new Intent(getApplicationContext(), AddUser.class);
            startActivityForResult(addUser, 1/* It can be any number you want*/);
        }
    }
});

然后在AddUser当用户输入完毕后,调用:

Intent result = new Intent();
result.putExtra("name", txtName.getText().toString());
setResult(RESULT_OK, result);

最后,在MainActivity 中覆盖onActivityResult

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == 1 && resultCode == RESULT_OK && data != null) {
        adapter.add(data.getStringExtra("name"));
        adapter.notifyDataSetChanged();
    }
}

【讨论】:

  • 谢谢!,但列表视图仍然没有显示任何内容......我将发布“AddUser”,告诉你我有什么代码。
  • 您不必在AddUser 的两个点击侦听器中再次启动MainActivity。只需致电finish
  • 哦,非常感谢,更改活动要容易得多!但是 txtName 仍然没有显示在 MainActivity 的列表视图中,但不再强制关闭应用程序
猜你喜欢
  • 1970-01-01
  • 2018-07-29
  • 1970-01-01
  • 2023-02-21
  • 2018-09-02
  • 1970-01-01
  • 2017-05-17
  • 1970-01-01
  • 2021-06-03
相关资源
最近更新 更多