Вызвано: java.lang.ClassCastException: android.app.Application не может быть приведен к com.example.myapp.MainActivity - PullRequest
0 голосов
/ 13 февраля 2019

Получение ошибки в logcat при запуске приложения. Ниже приведены logcat и java-код, я проверил эту проблему в потоке стека, но не смог найти решение.

MainActivity.Java

public class MainActivity extends AppCompatActivity {
    public boolean toasted = false;

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (!((MainActivity) getApplicationContext()).toasted) {  (MainActivity.java:28)
            Toast.makeText(MainActivity.this, "Welcome" , Toast.LENGTH_LONG).show();
            ((MainActivity)getApplicationContext()).toasted = true;
        }
}

Logcat

Caused by: java.lang.ClassCastException: android.app.Application cannot be cast to com.example.counter.MainActivity
        at com.example.myapp.MainActivity.onCreate(MainActivity.java:28)

Ответы [ 3 ]

0 голосов
/ 13 февраля 2019

Почему вы приводите getApplicationContext () к MainActivity?Вы должны получить контекст, подобный этому

  This.getApplicationContext();
0 голосов
/ 13 февраля 2019

Решение:

public class MainActivity extends AppCompatActivity {
    public boolean toasted = false;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (!toasted) {  
            Toast.makeText(MainActivity.this, "Welcome" , Toast.LENGTH_LONG).show();
            toasted = true;
        } 
    }

Эта проблема вызвана тем, что вы пытаетесь наложить Application в Activity.

Это просто невозможно, потому что когда вы читаете, есть определенные правила, которые необходимо соблюдать.

Application и Activity могут быть преобразованы в Context, поскольку они оба являются потомками класса Context.

Однако, если вы помните правила наследования в Java, экземпляры дочерних классов могут быть преобразованы в их родительский класс, а экземпляр родительского класса может быть приведен к его дочернему классу , только если изначально это был детский класс.

Поэтому, когда вы используете getApplicationContext(), вы получаете контекст для Application, а не для Activity.Вот почему приведение к MainActivity не удастся, потому что MainActivity - это потомок AppCompatActivity, который является потомком Activity, что полностью отличается от Application.

Нет также никаких причин, по которым вам следует требовать, чтобы кастинг делал то, что вы хотите.В данный момент вы находитесь внутри класса MainActivity, поэтому у вас есть прямой доступ к его переменным экземпляра.Нет необходимости выполнять дополнительные операции для извлечения контекста, его приведения, просто для назначения новой переменной переменной, к которой у вас уже есть доступ.

0 голосов
/ 13 февраля 2019

Вы пытаетесь понизить getApplicationContext () до MainActivity.

getApplicationContext () предоставит вам контекст приложения, и он не является частью Activity.

Если вам нужно сохранитьпеременная в вашей деятельности просто используйте this.toasted = true

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...