Объявлять деструкторы виртуальными в полиморфных базовых классах. Это пункт 7 в «Эффективном C ++» Скотта Майерса . Мейерс продолжает обобщать, что если класс имеет любую виртуальную функцию, он должен иметь виртуальный деструктор, а классы, не предназначенные для базовых классов или не предназначенные для использования полиморфно, должны не объявить виртуальные деструкторы.
Проблема заключается в этих строках.
final TextView mShowCounter = (TextView) findViewById(R.id.text_view_counter);
final Button button = (Button) findViewById(R.id.toast_button);
Ваше приложение выходит из строя, потому что во время фазы инициализации класса представления еще не существуют. findViewById
не будет работать.
Вместо этого вы должны перемещать эти строки внутри onCreate
.
Вы пытаетесь получить доступ к экземплярам **xml**
до того, как они будут созданы, что приводит к сбою приложения.
Чтобы проверить вызванное из-за вашего приложения повреждение, вы можете обратиться к флажку Logcat
в свою IDE .
Поместите код создания внутри 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));
}
}
}
Инициализация вашего компонента должна идти в onCreate()
. Поместите ваш
mShowCounter = (TextView) findViewById(R.id.text_view_counter);
button = (Button) findViewById(R.id.toast_button);
внутри onCreate()
.
Android-приложение продолжает сбой в AVD, но правильно построено в Gradle
blockquote>Поскольку вы выполняете
findViewById
внеonCreate()
, не делаяsetContentView()
Сделайте
findViewById
внутриonCreate()
метода послеsetContentView()
Объявите свой
TextView mShowCounter
иButton 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)); } } }
mShowCounter
глобальным, как мой ответ, он будет работать
– Nilesh Rathod
6 July 2018 в 04:02