【问题标题】:Android: app crashes on starting new activityAndroid:应用程序在开始新活动时崩溃
【发布时间】:2013-07-05 19:08:59
【问题描述】:

基本上,我想启动一个打印出输入字符串和下面的图像的活动。

在activity_display_message.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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:orientation="vertical" >

      <TextView 
            android:text="@+id/textView"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            />

        <ImageView
        android:id="@+id/imageView2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:src="@drawable/serious" />    


</LinearLayout>

这是 OnCreate() 中的代码:

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

    setContentView(R.layout.activity_display_message);  
    Intent intent = getIntent();

    String message = intent.getStringExtra(MainActivity.EXTRA_MESSAGE);

    ImageView image2 = (ImageView) findViewById(R.id.imageView2);


    // Create the text view

    TextView textView = (TextView)findViewById(R.id.textView);
    //textView.setTextSize(20);

    textView.setText(message);
    // Set the text view as the activity layout   


    // Show the Up button in the action bar.
    setupActionBar();
}

这段代码有什么问题吗?

编辑:不知道如何获取堆栈跟踪,但我刚刚在 Catlog 中找到了这些行:

07-05 12:26:53.677: E/AppsCustomizePagedView(611): Widget ComponentInfo{com.th.android.widget.gTabsimiClock/com.th.android.widget.gTabsimiClock.GTabsimiClock5x1} can not fit on this device (736, 144)
07-05 12:26:53.692: E/AppsCustomizePagedView(611): Widget ComponentInfo{at.abraxas.powerwidget.free/at.abraxas.powerwidget.free.SettingsAppWidgetProvider_5} can not fit on this device (760, 80)
07-05 12:26:57.958: E/AudioCache(131): Error 1, -1004 occurred
07-05 12:26:58.146: E/AudioCache(131): Error 1, -1004 occurred
07-05 12:26:58.630: E/AudioCache(131): Error 1, -1004 occurred
07-05 12:27:07.833: E/AudioCache(131): Heap size overflow! req size 1052672, max size: 1048576

这是堆栈跟踪吗?

07-05 12:41:10.058: E/TAG(22474): STACKTRACE
07-05 12:41:10.058: E/TAG(22474): java.lang.NullPointerException
07-05 12:41:10.058: E/TAG(22474):   at com.example.myfirstapp.DisplayMessageActivity.onCreate(DisplayMessageActivity.java:38)
07-05 12:41:10.058: E/TAG(22474):   at android.app.Activity.performCreate(Activity.java:5104)
07-05 12:41:10.058: E/TAG(22474):   at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
07-05 12:41:10.058: E/TAG(22474):   at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144)
07-05 12:41:10.058: E/TAG(22474):   at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
07-05 12:41:10.058: E/TAG(22474):   at android.app.ActivityThread.access$600(ActivityThread.java:141)
07-05 12:41:10.058: E/TAG(22474):   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
07-05 12:41:10.058: E/TAG(22474):   at android.os.Handler.dispatchMessage(Handler.java:99)
07-05 12:41:10.058: E/TAG(22474):   at android.os.Looper.loop(Looper.java:137)
07-05 12:41:10.058: E/TAG(22474):   at android.app.ActivityThread.main(ActivityThread.java:5041)
07-05 12:41:10.058: E/TAG(22474):   at java.lang.reflect.Method.invokeNative(Native Method)
07-05 12:41:10.058: E/TAG(22474):   at java.lang.reflect.Method.invoke(Method.java:511)
07-05 12:41:10.058: E/TAG(22474):   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
07-05 12:41:10.058: E/TAG(22474):   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
07-05 12:41:10.058: E/TAG(22474):   at dalvik.system.NativeStart.main(Native Method)

运行时崩溃时的堆栈跟踪:(上面是通过try / catch获得的)

07-05 12:52:24.386: E/AndroidRuntime(25496): FATAL EXCEPTION: main
07-05 12:52:24.386: E/AndroidRuntime(25496): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.myfirstapp/com.example.myfirstapp.DisplayMessageActivity}: java.lang.NullPointerException
07-05 12:52:24.386: E/AndroidRuntime(25496):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180)
07-05 12:52:24.386: E/AndroidRuntime(25496):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
07-05 12:52:24.386: E/AndroidRuntime(25496):    at android.app.ActivityThread.access$600(ActivityThread.java:141)
07-05 12:52:24.386: E/AndroidRuntime(25496):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
07-05 12:52:24.386: E/AndroidRuntime(25496):    at android.os.Handler.dispatchMessage(Handler.java:99)
07-05 12:52:24.386: E/AndroidRuntime(25496):    at android.os.Looper.loop(Looper.java:137)
07-05 12:52:24.386: E/AndroidRuntime(25496):    at android.app.ActivityThread.main(ActivityThread.java:5041)
07-05 12:52:24.386: E/AndroidRuntime(25496):    at java.lang.reflect.Method.invokeNative(Native Method)
07-05 12:52:24.386: E/AndroidRuntime(25496):    at java.lang.reflect.Method.invoke(Method.java:511)
07-05 12:52:24.386: E/AndroidRuntime(25496):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
07-05 12:52:24.386: E/AndroidRuntime(25496):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
07-05 12:52:24.386: E/AndroidRuntime(25496):    at dalvik.system.NativeStart.main(Native Method)
07-05 12:52:24.386: E/AndroidRuntime(25496): Caused by: java.lang.NullPointerException
07-05 12:52:24.386: E/AndroidRuntime(25496):    at com.example.myfirstapp.DisplayMessageActivity.onCreate(DisplayMessageActivity.java:38)
07-05 12:52:24.386: E/AndroidRuntime(25496):    at android.app.Activity.performCreate(Activity.java:5104)
07-05 12:52:24.386: E/AndroidRuntime(25496):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
07-05 12:52:24.386: E/AndroidRuntime(25496):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144)
07-05 12:52:24.386: E/AndroidRuntime(25496):    ... 11 more

消息不为空。当我将 OnCreate 更改为下面时,将打印消息:(但当然不是图像)

// Create the text view

//TextView textView = (TextView)findViewById(R.id.textView);
TextView textView = new TextView(this);
textView.setTextSize(20);

textView.setText(message);
setContentView(textView);

回答:发现错误: android:text="@+id/textView" 。应该是 android:id,而不是 android:text ...

但是谢谢大家的帮助。你们为像我这样的初学者提供了更好的 android 编程体验。

【问题讨论】:

  • 每当发生崩溃时,总是包含logcat,这意味着我们可以查明错误
  • 发布堆栈跟踪String message = intent.getStringExtra(MainActivity.EXTRA_MESSAGE) 消息可能为空
  • 粘贴 LogCat 和您将数据发送到此 Activity 的代码
  • @Squonk 你是对的。我刚刚检查了源代码@grepcode.com/file/repository.grepcode.com/java/ext/…。我将通过发布相同的答案来编辑我的答案。
  • @SquallLeonhart : “所以它不是 null 的消息。它是 textView?” - 正确。 textView.setText(message); 可能抛出 NPE 的唯一方法是 textViewnull。这可能是由于在创建视图之前尝试使用findViewById(...) 或指定错误(或无效)R.id 或在某些情况下R.java 文件已损坏而导致的。在后一种情况下,使用 Project -> Clean 应该可以解决问题。

标签: android crash textview


【解决方案1】:

你需要先给activity设置内容。

您可以将当前视图层次结构的findViewById 设置为活动。由于您尚未将内容设置为活动,因此如果您尝试初始化视图,您将获得NullPointerException

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_display_message); 
String message = intent.getStringExtra(MainActivity.EXTRA_MESSAGE);
ImageView image2 = (ImageView) findViewById(R.id.imageView2);
TextView textView = (TextView)findViewById(R.id.textView);
textView.setTextSize(20);
textView.setText(message);
....
}

编辑:

正如 Squonk 所说,setText(CharSequence text) 检查是否为空

来自

http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.2.2_r1/android/widget/TextView.java#TextView.setText%28java.lang.CharSequence%2Candroid.widget.TextView.BufferType%29

实现看起来像

3561    private void setText(CharSequence text, BufferType type,
3562                         boolean notifyBefore, int oldlen) {
3563        if (text == null) { // checking for null
3564            text = ""; 
3565        }   
        ..... 

所以第 38 行是textView.setText(message),这会导致 NPE。所以 textView 没有初始化导致 NPE。

进一步更新和 Squonk 评论

textview 可以为空,因为指定错误(或无效)R.id 或在某些情况下如果 R.java 文件已损坏。在后一种情况下,使用 Project -> Clean 应该可以解决问题。

还有这个

android:text="@+id/textView" // this is actually setting text to textview.

你不见了

android:id="@+id/textView" // textview id attribute missing

所以当你尝试初始化时

TextView textView = (TextView)findViewById(R.id.textView);
// there is no textview with id  textView which caused NPE

【讨论】:

    【解决方案2】:

    您是否在清单文件中声明了您的活动?请也检查一下。

    【讨论】:

    • 是的,我做到了。起初我只是显示图像并且它有效
    • 使用 Bundle extras = getIntent().getExtras(); 从以前的活动中检索数据然后通过调用 extras.getString("key").. 尝试这个编辑来检索它
    • @NirajAdhikari :这没什么区别 - getStringExtra(...) 方法是完全可以接受的。无需先使用getExtras() 获取Bundle
    【解决方案3】:

    setContentView 应该在创建 Imageview 对象之前调用。

    【讨论】:

      【解决方案4】:

      把 setContentView(R.layout.activity_display_message); onCreate 方法顶部的行。

          @Override
          public void onCreate() {
          super.onCreate();
          setContentView(R.layout.activity_display_message); 
      
          ......
          rest code
      
          }
      

      【讨论】:

      • 发表在原帖中。
      • @Mufazzal 你的 oncreate 没有捆绑参数
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多