为按钮创建一个类,但是出现NullException错误

时间:2016-02-19 00:41:12

标签: java android

我试图创建一个按钮类,用于创建按钮,在点击时启动对手机浏览器的意图,但我在设备上启动时会收到java.lang.NullPointerException 。我读到它可能是由findViewById返回null引起的,因为它指的是错误的View。我正在寻找一种方法将R从ItemActivity传递给ButtonInternetAcces但我读到没有必要。 eclipse没有错误,因此我对如何解决问题感到困惑。

这是可能导致错误的行:

Button goNextBtn = (Button) findViewById(R.id.internet_button);

班级ButtonInternetAccess

public class ButtonInternetAccess extends Activity{

    public Button main(final String url){

        Button goNextBtn = (Button) findViewById(R.id.internet_button);

        OnClickListener goToNet = new OnClickListener(){

        @Override
        public void onClick(View v){
            Intent net = new Intent(Intent.ACTION_VIEW);
            net.setData(Uri.parse(url));
            startActivity(net);
        }

        };

        goNextBtn.setOnClickListener(goToNet);

        return goNextBtn;
    }
}

活动课程ItemActivity

public class ItemActivity extends ActionBarActivity{

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_item);     
        TextView tvResponse = (TextView) findViewById(R.id.response);
        Intent i = getIntent();
        Bundle b = i.getExtras();
        String mid = b.getString("mid");
        tvResponse.setText(mid);

        ButtonInternetAccess bia = new ButtonInternetAccess();

        Button goNextBtn = bia.main("http://www.google.com");

    }
     //............ 

}

布局/ activity_item:

<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"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.app.ItemActivity" >

    <TextView
        android:id="@+id/response"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/second.welcome" />

    <Button
        android:id="@+id/internet_button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/response"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="70dp"
        android:text="Button" />

</RelativeLayout>

错误日志:

02-19 08:24:06.735: E/AndroidRuntime(9802): FATAL EXCEPTION: main
02-19 08:24:06.735: E/AndroidRuntime(9802): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.app/com.app.ItemActivity}: java.lang.NullPointerException
02-19 08:24:06.735: E/AndroidRuntime(9802):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2059)
02-19 08:24:06.735: E/AndroidRuntime(9802):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)
02-19 08:24:06.735: E/AndroidRuntime(9802):     at android.app.ActivityThread.access$600(ActivityThread.java:130)
02-19 08:24:06.735: E/AndroidRuntime(9802):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195)
02-19 08:24:06.735: E/AndroidRuntime(9802):     at android.os.Handler.dispatchMessage(Handler.java:99)
02-19 08:24:06.735: E/AndroidRuntime(9802):     at android.os.Looper.loop(Looper.java:137)
02-19 08:24:06.735: E/AndroidRuntime(9802):     at android.app.ActivityThread.main(ActivityThread.java:4745)
02-19 08:24:06.735: E/AndroidRuntime(9802):     at java.lang.reflect.Method.invokeNative(Native Method)
02-19 08:24:06.735: E/AndroidRuntime(9802):     at java.lang.reflect.Method.invoke(Method.java:511)
02-19 08:24:06.735: E/AndroidRuntime(9802):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
02-19 08:24:06.735: E/AndroidRuntime(9802):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
02-19 08:24:06.735: E/AndroidRuntime(9802):     at dalvik.system.NativeStart.main(Native Method)
02-19 08:24:06.735: E/AndroidRuntime(9802): Caused by: java.lang.NullPointerException
02-19 08:24:06.735: E/AndroidRuntime(9802):     at android.app.Activity.findViewById(Activity.java:1825)
02-19 08:24:06.735: E/AndroidRuntime(9802):     at com.component.ButtonInternetAccess.main(ButtonInternetAccess.java:16)
02-19 08:24:06.735: E/AndroidRuntime(9802):     at com.app.ItemActivity.onCreate(ItemActivity.java:30)
02-19 08:24:06.735: E/AndroidRuntime(9802):     at android.app.Activity.performCreate(Activity.java:5008)
02-19 08:24:06.735: E/AndroidRuntime(9802):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079)
02-19 08:24:06.735: E/AndroidRuntime(9802):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023)

2 个答案:

答案 0 :(得分:1)

假设这是layout / activity_item中的所有代码,问题在于:

setContentView(R.layout.activity_item);     
TextView tvResponse = (TextView) findViewById(R.id.response);

第一行是将layout / activity_item.xml指定为ItemActivity的布局。第二个查看布局文件内部以查找id为“response”的视图。但是,没有,因为该布局中的唯一视图是ID为“internet_button”的按钮。

我也很好奇,你有没有理由打造一个制作按钮的课程?您可以创建一个执行相同操作的方法并返回Button。

<强>更新

@Override
protected void onCreate(Bundle savedInstanceState) {  //put the code you had in main() here, after these two lines
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_item); //this should be the layout for this class; in this layout you should have the internet button
    ...
}

但是,如果重复使用Button就可以了,那么也许你应该让你的类扩展Button而不是Activity。这样,您可以在需要时简单地实例化该Button。查看this帖子,了解如何操作:

答案 1 :(得分:1)

您需要在所有活动中实现该侦听器。

您可以为您的应用程序(/res/layout/header.xml)编写自定义标题布局,其中包含&#34; bia&#34;具有单击侦听器集的按钮(指向onBIAClicked方法):

android:onClick =&#34; onBIAClicked&#34;

然后将此标题包含在每个活动布局中:

包括android:id =&#34; @ + id / header&#34;布局=&#34; @布局/报头&#34;

您还可以创建一个包含onBIAClicked方法声明的接口,实现该接口的所有活动都需要定义onBIAClicked方法的主体。