Новая активность Android не запускается

#java #android #android-intent #android-activity

#java #Android #android-намерение #android-активность

Вопрос:

Я написал этот код, следуя скелету «Профессиональной разработки приложений для Android 4» Рето Мейера и некоторому слайду моего профессора, но я не могу понять, почему новая активность (PreferencesActivity, полностью закодированная) не запускается и не вызывает каких-либо ошибок: в виртуальной машине это просто не сработаетчто-нибудь, когда я нажимаю «Настройки» в стандартном меню Android, которое я создал. Я правильно добавил новое действие в манифест приложения (только имя, метку, тему и ориентацию экрана).

Вот код

 public class MainActivity extends Activity implements OnClickListener, OnValueChangeListener {

static final private int MENU_PREFERENCES = Menu.FIRST 1;

...

@Override
    public boolean onCreateOptionsMenu(Menu menu){
        super.onCreateOptionsMenu(menu);
        menu.add(0, MENU_PREFERENCES, Menu.NONE, "Preferences");
        return true;
    }

public boolean onOptionsitemSelected(MenuItem item) {
    super.onOptionsItemSelected(item);
    switch(item.getItemId()) {
    case (MENU_PREFERENCES): {
        Intent i = new Intent(this, PreferencesActivity.class);
        startActivity(i);
        return true;
        }
    }
    return false;
}
...
}
 

Единственная странная вещь, которую я получаю, это предупреждение в Logcat

 06-20 14:50:49.760: W InputManagerService(699): Window already focused, ignoring focus gain of: com.android.internal.view.IInputMethodClient$Stub$Proxy@41219950
 

Комментарии:

1. Эй, ты нашел решение? У меня тоже сейчас такая же проблема, хотя она работала всего несколько дней назад. Понятия не имеете, в чем проблема прямо сейчас?

Ответ №1:

Вы можете использовать их оба

 Intent i = new Intent(getApplicationContext(), PreferencesActivity.class);

Intent i = new Intent(MainActivity.this, PreferencesActivity.class);
 

Но лучше использовать 1-й, потому что во 2-м может возникнуть проблема с утечкой памяти, а также просто добавьте эту строку в свой файл манифеста.

 <activity android:name=".PreferencesActivity" />
 

Ответ №2:

Ваш код :

 Intent i = new Intent(this, PreferencesActivity.class);
startActivity(i);
return true;
 

Вместо this того, чтобы вам нужно передать MainActivity.this

 Intent i = new Intent(MainActivity.this, PreferencesActivity.class);
startActivity(i);
return true;
 

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

Комментарии:

1. Не работает, снова 06-21 09:49:30.332: W / InputManagerService(392): окно уже сфокусировано, игнорируя усиление фокуса: com.android.internal.view . IInputMethodClient $Stub $Proxy@4122fb08

Ответ №3:

Вместо использования this , которое вы могли бы использовать getApplicationContext() , оно предоставляет вам контекст объекта приложения для текущего процесса.

Попробуйте это….

     Intent i = new Intent(getApplicationContext(), PreferencesActivity.class);
    startActivity(i);
 

Это может вам помочь..

Комментарии:

1. getapplicationContext() как следует из названия, дает вам контекст объекта приложения для текущего процесса, а не контекст вашей активности. Из документации Android: верните контекст единого глобального объекта приложения текущего процесса. Обычно это следует использовать только в том случае, если вам нужен контекст, жизненный цикл которого отделен от текущего контекста, который привязан к времени жизни процесса, а не к текущему компоненту.

2. Не работает, снова 06-21 09:49:30.332: W / InputManagerService(392): окно уже сфокусировано, игнорируя усиление фокуса: com.android.internal.view . IInputMethodClient $Stub $Proxy@4122fb08

Ответ №4:

Вам нужно передать MainActivity

   Intent i = new Intent(MainActivity.this, PreferencesActivity.class);
  startActivity(i);
  return true;
 

Лучше использовать меню

    @Override
      public boolean onOptionsItemSelected(MenuItem item) {   

       Log.d(TAG, "onOptionsItemSelected()");

      switch (item.getItemId()) {        
   case android.R.id.yourId:            
    finish();      
    return true; 
   case R.id.Yourid:
    return true;
    default:            
    return super.onOptionsItemSelected(item);  
 

Ответ №5:

Вы также можете написать startActivity(new Intent(getApplicationContext(),NextActivity.class));

введите имя своего действия в NextActivity.class