#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