【问题标题】:Basic android debugging [closed]基本的android调试[关闭]
【发布时间】:2013-07-18 07:36:54
【问题描述】:

当我在我的 Nexsus 4 上启动应用程序时,我似乎强制关闭。很有可能只是我在胡闹,但我找不到代码有什么问题。

Android Studio 不会出错。被注释掉的重置方法我应该重置复选框和TextView。

为什么我不能在 onCreate 之前定义项目?当我在“重置”方法中无法使用它们之后定义它们时..

有人可以看看吗?

package com.example.myapplication;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.TextView;
public class MainActivity extends Activity {

    final TextView txtTest = (TextView) findViewById(R.id.txtOut);
    final CheckBox chkTest = (CheckBox) findViewById(R.id.chkTest);
    final Button btnTest = (Button) findViewById(R.id.btnTest);
    final EditText etTest = (EditText) findViewById(R.id.etTest);
    String text = "";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);

            chkTest.setChecked(true);

            chkTest.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                            if (chkTest.isChecked()) {
                                    txtTest.setText("Checked :)");
                            } else txtTest.setText("Not Checked");
                    }
            });

            btnTest.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                            //etTest.getText().toString(text);
                            text = etTest.toString();
                      // Reset(text);
                    }
            });
            /*void Reset(String text) {
                    chkTest.setChecked(false);
                    txtTest.setText(text);
            }*/
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
            // Inflate the menu; this adds items to the action bar if it is present.
            getMenuInflater().inflate(R.menu.main, menu);
            return true;
    }
}

这是 logcat 错误:

java.lang.RuntimeException: Unable to instantiate activity
ComponentInfo{[...].MyActivity}: java.lang.NullPointerException

【问题讨论】:

  • 一些适合大众的logcat
  • 请看下面我的回答,如果您首先提高对java编程和android编程的了解,对您来说会更好。

标签: java android methods


【解决方案1】:

您不能以这种方式初始化项目!执行代码final TextView txtTest = (TextView) findViewById(R.id.txtOut); 时布局尚未膨胀,因此您有一个空指针异常。此外,在 onCreate() 之外定义 reset() 方法。 请参阅以下代码:

    TextView txtTest = null;
    CheckBox chkTest = null;
    Button btnTest = null;
    EditText etTest = null;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    txtTest = (TextView) findViewById(R.id.txtOut);
    chkTest = (CheckBox) findViewById(R.id.chkTest);
    btnTest = (Button) findViewById(R.id.btnTest);
    etTest = (EditText) findViewById(R.id.etTest);

    ....
 }


 void reset(String text) {
      chkTest.setChecked(false);
      txtTest.setText(text);
 }

【讨论】:

    【解决方案2】:

    还没有创建的时候找不到视图,试试这个:

    package com.example.myapplication;
    import android.os.Bundle;
    import android.app.Activity;
    import android.view.Menu;
    import android.view.View;
    import android.widget.Button;
    import android.widget.CheckBox;
    import android.widget.EditText;
    import android.widget.TextView;
    public class MainActivity extends Activity {
    
        TextView txtTest = null;
        CheckBox chkTest = null;
        Button btnTest = null;
        EditText etTest = null;
        String text = "";
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);
    
                txtTest = (TextView) findViewById(R.id.txtOut);
                chkTest = (CheckBox) findViewById(R.id.chkTest);
                btnTest = (Button) findViewById(R.id.btnTest);
                etTest = (EditText) findViewById(R.id.etTest);
    
    
                chkTest.setChecked(true);
    
                chkTest.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View view) {
                                if (chkTest.isChecked()) {
                                        txtTest.setText("Checked :)");
                                } else txtTest.setText("Not Checked");
                        }
                });
    
                btnTest.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View view) {
                                //etTest.getText().toString(text);
                                text = etTest.toString();
                          // Reset(text);
                        }
                });
        }
    
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
                // Inflate the menu; this adds items to the action bar if it is present.
                getMenuInflater().inflate(R.menu.main, menu);
                return true;
        }
        private void Reset(String text) {
                chkTest.setChecked(false);
                txtTest.setText(text);
        }
    
    }
    

    【讨论】:

    • 谢谢!您基本上所做的是将它们设置为 null 以便重置代码可以到达它们?
    • 您需要在类级别声明它才能在重置方法中看到它(请参阅我已更改此方法的范围)。您需要将其设置为 null,因为在类声明级别,视图尚未膨胀(创建),它在 onCreate 中创建
    【解决方案3】:

    您不能导致您正在初始化的项目位于activity_main.xml 上,并且您在初始化后设置了内容视图。在onCreate()中进行初始化。

    【讨论】:

      【解决方案4】:

      首先您必须在onCreate() 之外定义Reset() 函数。那不是正确的方法。 其次,我观察到您刚刚开始这样做,所以我建议在xml 中定义views,然后对它们采取行动。您可以在xml 中最初将checkbox 设置为true,然后在代码中设置为false。

      【讨论】:

        猜你喜欢
        • 2020-09-03
        • 1970-01-01
        • 2013-05-31
        • 1970-01-01
        • 2019-05-16
        • 2015-01-23
        • 2014-11-12
        • 1970-01-01
        • 2010-10-31
        相关资源
        最近更新 更多