0

我有一个 MainActivity.class 我在其上执行 setContentView,这是我以前使用的三个变量

    EditText labelText = (EditText) findViewById(R.id.label_field);
    EditText phoneText = (EditText) findViewById(R.id.phone_field);
    Spinner deviceTypeSpinner = (Spinner) findViewById(R.id.device_type_spinner);
    Button registerButton = (Button) findViewById(R.id.register_button)

现在,我有一个扩展异步任务的单独类,我正在尝试从异步任务(位于另一个文件中的类)中修改上述字段。

为了做到这一点,我将活动的上下文传递给异步任务并执行以下步骤

            MainActivity activity = (MainActivity)context;
            Button buttonRegister =(Button)activity.findViewById(R.id.register_button);
            EditText labelText = (EditText)activity.findViewById(R.id.label_field);

            buttonRegister.setEnabled(true);
            labelText.setFocusable(true);

但是 buttonRegister 返回 null 并且应用程序崩溃了,谁能告诉我哪里出错了,

  java.lang.NullPointerException
    at        com.yantranet.minixagent.requests.DeviceCreateRequest$1.onClick(DeviceCreateRequest.java:237)
    at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:167)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:137)
    at android.app.ActivityThread.main(ActivityThread.java:4895)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:511)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:994)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:761)
    at dalvik.system.NativeStart.main(Native Method)
4

4 回答 4

2

但是 buttonRegister 返回 null 并且应用程序崩溃了,谁能告诉我哪里出错了,

我看不到你在哪里打电话

setContentView(<layout>);

方法。没有它,它总是返回NPE,因为此方法关心指定布局中所有 UI 实例的初始化。在初始化小部件之前,您必须始终调用它

findViewById(<id>);

由于您在另一个班级中调用它,因此它不起作用(班级对您在其他班级所做的一无所知)。你需要:

  • 通过一些构造函数传递小部件
  • 更改应用程序逻辑(很可能未正确指定)
于 2013-07-30T06:18:51.457 回答
1

如果您传递了正确的活动上下文,那么它应该可以工作,但我不希望将上下文传递给另一个类,因为它与活动无关。您可以使用以下设计。

  1. 使用异步类注册监听器
  2. 在活动中实现该侦听器
  3. 一旦异步任务完成它的工作,它将调用该侦听器
  4. Activity 将在侦听器执行时随心所欲地更改 UI。
于 2013-07-30T06:19:06.413 回答
1

您不能在 doInBackgroud() 中修改布局元素。

class MyAsync extends AsyncTask<String, Integer, String>{

@Override
protected void onPreExecute() {
    // TODO Auto-generated method stub
    super.onPreExecute();
}
@Override
protected String doInBackground(String... params) {
    // TODO Auto-generated method stub
    return null;
}
@Override
protected void onPostExecute(String result) {
    // TODO Auto-generated method stub
    super.onPostExecute(result);
}

}

您可以使用onPreExecute()onPostExecute(String result)修改布局元素。

现在,我建议您在调用 AsyncClass 执行的同一类中覆盖 onPostExecute()。前任:-

new MyLoadAsync(Inbox.this){
            private ProgressDialog pDialog;
            @Override
            protected void onPreExecute() {
                pDialog = new ProgressDialog(Inbox.this);//////////
                pDialog.setMessage("Loading... Please wait...");
                pDialog.setIndeterminate(false);
                pDialog.setCancelable(false);
                pDialog.show();
                super.onPreExecute();
            }
            @Override
            protected void onPostExecute(JSONArray result) {
                pDialog.dismiss();
                if(result!=null){

                }
                super.onPostExecute(result);
            }


        }.execute("your_param");

因此,您可以在这里访问您的布局参数。

于 2013-07-30T06:24:07.217 回答
1

这不是一个好方法,但是如果您想访问其他活动的小部件,那么您应该为其设置 getter setter。

//In you mainActivity
public Button getRegisterButton()
{
     //Return register button here.
     return btn;
}
public EditText getFieldEditText()
{
      //Return editText here;
      return eText;
}

在你想要这个视图的地方编码。

//在当前活动中。

            MainActivity activity = (MainActivity)context;
            Button buttonRegister =activity.getRegisterButton();
            EditText labelText = activity.getFieldEditText();
         if(buttonRegister != null)
         {
            buttonRegister.setEnabled(true);
         }
         if(labelText != null)
         {
            labelText.setFocusable(true);
         }

希望这会有所帮助。

于 2013-07-30T06:32:56.060 回答