我试图创建一个按钮类,用于创建按钮,在点击时启动对手机浏览器的意图,但我在设备上启动时会收到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)
答案 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方法的主体。