2014-01-11 5 views
6

Я ищу еще несколько часов и не нашел ответа, который я понял/искал.close PreferenceFragment

Я настраиваю экран предпочтений, который открывается, когда пользователь нажимает настройки в меню. Это работает. Но как мне лучше всего позволить пользователю закрыть этот экран, когда он закончит настройку.

Мне нравится, как это делается в Chrome, где вы можете вернуться к предыдущему экрану.

Другие возможности также оцениваются.

активность, которая падает предпочтение (к которому он должен вернуться):

public class MainActivity extends Activity 
    { 
     @Override 
     public void onCreate(Bundle savedInstanceState) 
     { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.main); 
     } 

     public void startGame(View view) 
     { 
      Intent intent = new Intent(this, Game.class); 
      startActivity(intent); 
     } 

      @Override 
     public boolean onCreateOptionsMenu(Menu menu) 
     { 
      MenuInflater inflater = getMenuInflater(); 
      inflater.inflate(R.layout.game_settings, menu); 
      return super.onCreateOptionsMenu(menu); 
     } 

     @Override 
     public boolean onOptionsItemSelected(MenuItem item) 
     { 
      switch (item.getItemId()) 
      { 
     case R.id.action_settings: 
      getFragmentManager().beginTransaction() 
       .replace(android.R.id.content, new SettingsFragment()) 
       .commit(); 
      return true; 

     default: 
      return super.onOptionsItemSelected(item); 
      } 
     } 
    } 

Предпочтения:

public class SettingsFragment extends PreferenceFragment 
    { 
     @Override 
     public void onCreate(Bundle savedInstanceState) 
     { 
      super.onCreate(savedInstanceState); 
      addPreferencesFromResource(R.layout.preferences); 
     } 
    } 

XML:

<?xml version="1.0" encoding="utf-8"?> 
    <PreferenceScreen 
    xmlns:android="http://schemas.android.com/apk/res/android" > 
    <PreferenceCategory android:title="@string/game_settings"> 
     <ListPreference 
     android:title="@string/circle_setting_title" 
     android:key="circle_setting" 
     android:summary="@string/circle_setting_summary" 
     android:entries="@array/circle_setting_amount" 
     android:entryValues="@array/circle_setting_amount_value" 
     android:defaultValue="3"/> 
     <ListPreference 
     android:title="@string/color_setting_title" 
     android:key="color_setting" 
     android:summary="@string/color_setting_summary" 
     android:entries="@array/color_setting_amount" 
     android:entryValues="@array/color_setting_amount_value" 
     android:defaultValue="3"/> 
    </PreferenceCategory> 
    </PreferenceScreen> 
+0

Как насчет нажатия кнопки «Назад»? Это должно работать так. –

+0

Затем он закрывает все приложение. –

+0

Нет. Это если вы ударили его дважды. ИЛИ если вы поместите код в свой onBackPressed, чтобы завершить свое приложение. Не путайте Back with Home ... –

ответ

1

Чтобы MainActivity родительскую активность в Предпочтения:
Предполагая, что у вас уже есть ваши префы .xml (или что вы хотите назвать его) файл в папку/Рез XML:

Объявить свою деятельность в манифесте (в разделе приложения):

<!-- Main activity --> 
<activity 
    android:name="com.example.app.MainActivity" 
    android:label="@string/app_name" > 
    <intent-filter> 
     <action android:name="android.intent.action.MAIN" /> 
     <category android:name="android.intent.category.LAUNCHER" /> 
    </intent-filter> 
</activity> 

<!-- Preferences --> 
<activity 
    android:name="com.example.app.PrefsActivity" 
/> 

Тогда, если у вас есть меню, кнопки, или все, что вы хотите, чтобы показать свои PreferenceScreen с, просто добавьте эту строку в обработчик события:

startActivity(new Intent(this, PrefsActivity.class)); 
+0

Мне нужно было добавить активность между Main и Fragment, но это работает. –

+0

Несомненно, я пропустил часть, что это был PreferenceFragment ... Я предположил, что это PreferenceActivity. Итак, вы добавили функцию PreferenceActivity, которая открывает фрагмент, и это нормально. ;) –

+0

Как вернуть его к последнему действию, когда пользователь нажимает кнопку возврата в верхнем углу, если я реализую настройки для разных видов деятельности? –

1

в своем коде, у вас есть:

@Override 
    public boolean onOptionsItemSelected(MenuItem item) 
    { 
     switch (item.getItemId()) 
     { 
    case R.id.action_settings: 
     getFragmentManager().beginTransaction() 
      .replace(android.R.id.content, new SettingsFragment()) 
      .commit(); 
     return true; 

    default: 
     return super.onOptionsItemSelected(item); 
     } 
    } 

Вместо этого, вы можете продлить его следующим образом:

@Override 
    public boolean onOptionsItemSelected(MenuItem item) 
    { 
     switch (item.getItemId()) 
     { 
    case R.id.action_settings: 
     getFragmentManager().beginTransaction() 
      .replace(android.R.id.content, new SettingsFragment()) 
      .addToBackStack("settings") 
      .commit(); 
     return true; 

    default: 
     return super.onOptionsItemSelected(item); 
     } 
    } 

Теперь сделка будет помнить и обратное, когда кто-то нажимает на кнопку назад.

+0

. Я не был достаточно конкретным. Сожалею. Я имею в виду кнопку верхнего legt, которая вызывает активность, установленную как родительский в манифесте. Стандартная кнопка возврата работает нормально, но некоторые пользователи предпочитают другую кнопку. –

0

Вместо создания нового действия просто переопределите макет фрагмента предпочтения и раздуйте макет с помощью кнопки внутри. Затем прослушайте событие с нажатой кнопкой, чтобы закрыть фрагмент.

7

Неверный принятый ответ. Выполняя: startActivity(new Intent(this, PrefsActivity.class));, вы фактически добавляете новую активность в свой стек.

Если вы хотите вернуться на экран, вы должны использовать метод onBackPressed.

пример кода должен выглядеть следующим образом:

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    int id = item.getItemId(); 
    if (id == android.R.id.home) { 
     getActivity().onBackPressed(); 
     return true; 
    } 
    return super.onOptionsItemSelected(item); 
} 

выше решение будет установить домашнюю кнопку на панели действий, чтобы реагировать так же, как кнопка возврата. Обе кнопки возвратятся в стек активности к параметру SettingsActivity (одно действие раньше).

+0

Это правильно и должно быть принято. Класс PreferenceActivity уже имеет реализацию для управления добавлением/удалением PreferenceFragments из стека, поэтому нам не нужно переписывать его. – ravindu1024

Смежные вопросы