繁体   English   中英

在方法中设置 OnClickListener 时出现 NullPointerException

[英]NullPointerException when setting OnClickListener in method

我正在创建地址簿,但是当我添加新号码并从 XML 获取按钮时,我收到NullPointerException 这是导致错误的代码

package oo.seniorlauncher.com.o_seniorlauncher;

import oo.seniorlauncher.com.o_seniorlauncher.util.SystemUiHider;

import android.annotation.TargetApi;
import android.app.Activity;
import android.content.Context;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;



public class newNumber extends Activity {

boolean ready = false;
EditText nameField;
EditText numberField;
Context context;

String name;
String number;
String place= "";
public boolean ready(){

    return ready;

}

public void run(String plac,Context context){
    this.context = context;
   place = plac;
    MainFrame frame = new MainFrame();
    ((Activity) context).setContentView(R.layout.adnumber);
   set();
}public void sey(){
// this causes the error Button button= (Button)findViewById(R.id.readyButton); 
    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            nameField = (EditText) findViewById(R.id.NameField);
            numberField = (EditText)findViewById(R.id.Number);
            name = nameField.getText().toString();
            number =numberField.getText().toString();
            MainFrame frame = new MainFrame();
            frame.adName(name,place);
            frame.adNumber(number, place);
            ((Activity) context).setContentView(R.layout.adnumber);
        }
    });
}

这是错误

  java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.view.Window.findViewById(int)' on a null object reference
        at android.app.Activity.findViewById(Activity.java:2072)
        at oo.seniorlauncher.com.o_seniorlauncher.newNumber.set(newNumber.java:60)
        at oo.seniorlauncher.com.o_seniorlauncher.newNumber.run(newNumber.java:58)
        at oo.seniorlauncher.com.o_seniorlauncher.MainFrame$3.onClick(MainFrame.java:116)
        at android.view.View.performClick(View.java:4780)
        at android.view.View$PerformClick.run(View.java:19866)
        at android.os.Handler.handleCallback(Handler.java:739)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:135)
        at android.app.ActivityThread.main(ActivityThread.java:5257)
        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:903)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)

这是我的 XML 文件

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="oo.seniorlauncher.com.o_seniorlauncher.newNumber">


<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textAppearance="?android:attr/textAppearanceLarge"
    android:text="Syötä"
    android:id="@+id/textView"
    android:layout_alignParentTop="true"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true"
    android:layout_alignParentRight="true"
    android:layout_alignParentEnd="true"
    android:height="100dp"
    android:textSize="50dp" />

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textAppearance="?android:attr/textAppearanceLarge"
    android:text="numero"
    android:id="@+id/textView2"
    android:layout_alignParentTop="true"
    android:layout_alignBottom="@+id/textView"
    android:layout_alignParentRight="true"
    android:layout_alignParentEnd="true"
    android:width="250dp"
    android:textSize="50dp" />

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textAppearance="?android:attr/textAppearanceLarge"
    android:text="ja nimi"
    android:id="@+id/textView3"
    android:height="100dp"
    android:layout_alignParentTop="true"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true"
    android:layout_marginTop="66dp"
    android:layout_alignParentRight="true"
    android:layout_alignParentEnd="true"
    android:textSize="50dp" />

<EditText
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:inputType="textPersonName"
    android:ems="10"
    android:id="@+id/NameField"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true"
    android:layout_alignParentRight="true"
    android:layout_alignParentEnd="true"
    android:textSize="50dp"
    android:layout_centerVertical="true"
    android:text="Nimi" />

<EditText
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:inputType="phone"
    android:ems="10"
    android:id="@+id/Number"
    android:layout_below="@+id/NameField"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true"
    android:layout_alignParentRight="true"
    android:layout_alignParentEnd="true"
    android:textSize="50dp"
    android:text="Numero"
    android:phoneNumber="true" />

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Valmis"
    android:id="@+id/readyButton"
    android:layout_below="@+id/Number"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true"
    android:layout_alignParentBottom="true"
    android:layout_alignParentRight="true"
    android:layout_alignParentEnd="true"
    android:textSize="75dp" />

</RelativeLayout>

我几乎尝试了所有方法,但不知道导致错误的原因。

您必须在onCreate方法中设置内容视图:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.adnumber);
}

您的活动应该有一个onCreate()方法,您可以在其中初始化您的视图。

像这样:

 @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.adnumber);
    //initialize your views here
    nameField = (EditText) findViewById(R.id.NameField);
    numberField = (EditText)findViewById(R.id.Number);


}

您必须通过setContentView("your_layout_ID")将内容视图设置为活动,并且setContentView("your_layout_ID")用于从 XML 文件获取所有小部件的代码放在 onCreate 函数上。

不要听其他人建议将 setContentView() 移动到 onCreate() ......它确实是最好的,但你可以将它设置在你想要的任何地方......直到你这样做你只会有一个黑屏。 有些人只是不知道 Android 是如何工作的,只是从教程中复制了代码。 您想要构建、扩充和填充到活动中的视图层次结构可以随时完成,因此一切都会好起来的 ;)

话虽如此,请向我们展示 xml 文件

编辑:在执行任何 findviewbyid 之前,您当然必须设置内容视图,以便您可以引用内存中的单个对象,否则您会得到空指针异常:)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM