【问题标题】:Android app keeps crashing in AVD, but is built properly in GradleAndroid 应用程序在 AVD 中不断崩溃,但在 Gradle 中正确构建
【发布时间】:2018-07-06 03:53:31
【问题描述】:

我制作了这个带有两个按钮和一个 textview 的小型 android 应用程序,非常基本。但它不是在模拟器中启动的。没有任何构建错误。

这是 activity_main.xml 文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
android:orientation="vertical">

<Button
    android:id="@+id/toast_button"
    android:layout_width="match_parent"
    android:layout_height="50dp"
    android:layout_marginLeft="20dp"
    android:layout_marginRight="20dp"
    android:layout_marginTop="20dp"
    android:text="@string/toast_text"
    android:background="@color/colorPrimary"
    android:textColor="@color/white"
    android:onClick="showToast"/>

<TextView
    android:id="@+id/text_view_counter"
    android:layout_width="match_parent"
    android:layout_height="370dp"
    android:background="@color/yellow"
    android:layout_marginLeft="20dp"
    android:layout_marginRight="20dp"
    android:text="@string/counter_initial_value"
    android:textSize="160sp"
    android:gravity="center"
    android:textStyle="bold"
    android:textColor="@color/colorPrimary"
    />


<Button
    android:id="@+id/count_button"
    android:layout_width="match_parent"
    android:layout_height="50dp"
    android:layout_marginLeft="20dp"
    android:layout_marginRight="20dp"
    android:text="@string/count"
    android:background="@color/colorPrimary"
    android:textColor="@color/white"
    android:onClick="counterUp"/>
    </LinearLayout>

这是 MainActivity.java 文件

package com.example.android.testapplication;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

final TextView mShowCounter = (TextView) findViewById(R.id.text_view_counter);
final Button button = (Button) findViewById(R.id.toast_button);
private int mCount = 0;

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


public void showToast(View view) {
    Toast toast = Toast.makeText(this, 
R.string.toast_popup,Toast.LENGTH_LONG);
    toast.show();
}

public void counterUp(View view) {
    mCount++;
    if(mShowCounter != null) {
        mShowCounter.setText(Integer.toString(mCount));
    }
}
}

我尝试过制作多个项目,但这不起作用。在第一个项目中,它在第一次构建后开始显示错误,说“无法解析符号 R”,并以红色突出显示 R 的所有实例。但是,在这个版本中没有任何错误,即使在模拟器中应用程序也没有启动一次。

【问题讨论】:

  • 要检查由于您的应用程序崩溃导致的原因,您可以参考将 Logcat 检查到您的 IDE 中。

标签: java android android-layout android-studio


【解决方案1】:

您正试图在 **xml** 实例创建之前访问它,这会导致应用程序崩溃。

要检查由于您的应用程序崩溃导致的原因,您可以参考在您的 IDE 中检查 Logcat

将你的实例化代码放入onCreate()回调中:-

package com.example.android.testapplication;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

final TextView mShowCounter;
final Button button;
private int mCount = 0;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mShowCounter = (TextView) findViewById(R.id.text_view_counter);
    button = (Button) findViewById(R.id.toast_button);
}


public void showToast(View view) {
    Toast toast = Toast.makeText(this, 
R.string.toast_popup,Toast.LENGTH_LONG);
    toast.show();
}

public void counterUp(View view) {
    mCount++;
    if(mShowCounter != null) {
        mShowCounter.setText(Integer.toString(mCount));
    }
}
}

【讨论】:

  • 非常感谢@MrRoshan 在这个问题上帮助我!
  • 欢迎老板..!!
【解决方案2】:

Android 应用在 AVD 中不断崩溃,但在 Gradle 中正确构建

因为你在onCreate()之外做findViewById而不做setContentView()

setContentView()

之后在onCreate()方法内执行findViewById

将您的 TextView mShowCounterButton button; 声明为全局

示例代码

public class MainActivity extends AppCompatActivity {

 TextView mShowCounter ;
 Button button  ;
private int mCount = 0;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
     mShowCounter = (TextView) findViewById(R.id.text_view_counter);
     button = (Button) findViewById(R.id.toast_button);
}


public void showToast(View view) {
    Toast toast = Toast.makeText(this, 
R.string.toast_popup,Toast.LENGTH_LONG);
    toast.show();
}

public void counterUp(View view) {
    mCount++;
    if(mShowCounter != null) {
        mShowCounter.setText(Integer.toString(mCount));
    }
}
}

【讨论】:

  • @AqibAhmed 声明您的 mShowCounter 像我的回答一样是全球性的,它将起作用
  • 成功了!非常感谢您提供的即时帮助。非常感谢!
  • @AqibAhmed 很乐意为您提供帮助
  • @NileshRathod 他还没有特权。但我有..!!
【解决方案3】:

问题在于这几行。

final TextView mShowCounter = (TextView) findViewById(R.id.text_view_counter);
final Button button = (Button) findViewById(R.id.toast_button);

您的应用程序崩溃是因为在类初始化阶段,视图还不存在。 findViewById 将不起作用。

您应该将这些行移到 onCreate 内。

【讨论】:

    【解决方案4】:

    你的组件初始化应该放在onCreate(),即把你的

    mShowCounter = (TextView) findViewById(R.id.text_view_counter);
    button = (Button) findViewById(R.id.toast_button);
    

    onCreate() 内部。

    【讨论】:

      猜你喜欢
      • 2018-12-27
      • 1970-01-01
      • 1970-01-01
      • 2013-03-26
      • 2018-08-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多