2014-06-21 2 views
2

Я написал этот код, следуя скелету «Профессиональный Android 4 Application Development» от Reto Meier и некоторый слайд моего профессора, но я не могу понять, почему новая активность (PreferencesActivity, полностью закодированная) не является запускать и не поднимать никаких ошибок: в VM он ничего не сделает, когда я нажимаю «Настройки» в стандартном меню Android, которое я создал. Я добавил новую активность в манифесте приложения правильно (просто имя, метка, тема и ориентация экрана).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: [email protected] 
+0

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

ответ

0

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

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

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

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

+1

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

+0

ohh my bad .. я должен использовать правильное слово. .thanks для обмена знаниями .. –

+0

Всегда приветствуются. :) – CodeWarrior

0

Ваш код:

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; 

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

+0

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

+0

@ArrigoPierotti –

1

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

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

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

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

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

Вам необходимо пройти 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); 
Смежные вопросы