2014-01-11 4 views
6

Ich suche wieder Stunden und habe keine Antwort gefunden, die ich verstanden habe/gesucht habe.schließen PreferenceFragment

Ich habe einen Einstellungsbildschirm, der geöffnet wird, wenn der Benutzer auf Einstellungen im Menü klickt. Das funktioniert. Aber wie kann ich den Benutzer am besten dazu bringen, diesen Bildschirm zu schließen, wenn er fertig ist?

Ich mag die Art, wie es in Chrome gemacht wird, wo Sie zum vorherigen Bildschirm zurückkehren können.

Andere Möglichkeiten werden ebenfalls geschätzt.

Aktivität, die die Präferenz fällt (auf die zurückgegeben werden soll):

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); 
      } 
     } 
    } 

Vorlieben:

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

Wie wäre es mit dem Zurück-Knopf? Es sollte so funktionieren. –

+0

Dann schließt er die ganze App. –

+0

Nein. Das ist, wenn Sie es zweimal drücken. ODER wenn Sie Code in Ihr onBackPressed setzen, um Ihre APP zu beenden. Verwechseln Sie nicht Zurück mit Home ... –

Antwort

1

Damit MainActivity die übergeordnete Aktivität von Einstellungen:
Angenommen, Sie haben bereits Ihre Einstellungen .xml (oder was auch immer Sie es nennen wollen) Datei in Ihrem res/xml-Ordner:

Erklären Sie Ihre Aktivitäten in Ihrem Manifest (im Anwendungsabschnitt):

<!-- 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" 
/> 

Dann vorausgesetzt, Sie haben ein Menü, eine Taste, oder was auch immer Sie mit Ihrem PreferenceScreen zeigen möchten, fügen Sie einfach diese Zeile in der Event-Handler:

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

Ich musste eine Aktivität zwischen Main und Fragment hinzufügen, aber es funktioniert. –

+0

Sicher, ich übersprang den Teil, dass es ein PreferenceFragment war ... Ich nahm an, es war eine PreferenceActivity. Sie haben also eine PreferenceActivity hinzugefügt, die das Fragment öffnet, was in Ordnung ist. ;) –

+0

Wie kann ich zur letzten Aktivität zurückkehren, wenn der Benutzer auf die Zurück-Schaltfläche in der oberen Ecke klickt, wenn ich Einstellungen für verschiedene Aktivitäten implementiere? –

1

in Ihrem Code Sie haben:

@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); 
     } 
    } 

Stattdessen könnten Sie es wie folgt erweitern:

@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); 
     } 
    } 

Nun wird die Transaktion in Erinnerung und umgekehrt, wenn jemand drückt die Zurück-Taste.

+0

Ich war nicht spezifisch genug. Es tut uns leid. Ich meine die obere Schaltfläche, die die Aktivität als übergeordnetes Element im Manifest aufruft. Der Standard-Return-Button funktioniert gut, aber manche Benutzer bevorzugen den anderen Button. –

0

Anstatt eine neue Aktivität zu erstellen, überschreiben Sie einfach das Layout des Präferenzfragments und blenden ein Layout mit der Schaltfläche innen auf. Hören Sie dann auf das angeklickte Ereignis, um das Fragment zu schließen.

7

Die akzeptierte Antwort ist nicht korrekt. Indem Sie Folgendes tun: startActivity(new Intent(this, PrefsActivity.class)); fügen Sie Ihrem Stapel tatsächlich eine neue Aktivität hinzu.

Wenn Sie einen Bildschirm zurückgehen möchten, sollten Sie die onBackPressed-Methode verwenden.

Codebeispiel soll wie folgt lauten:

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

Die obige Lösung wird die Home-Taste auf der Aktionsleiste stellen Sie das gleiche wie das Return-Taste reagieren. Die beiden Schaltflächen gehen auf den Stack der Aktivität zurück zu SettingsActivity (One Activity vorher).

+0

Dies ist korrekt und sollte die akzeptierte Antwort sein. Die PreferenceActivity-Klasse verfügt bereits über die Implementierung zum Hinzufügen/Entfernen von PreferenceFragments aus dem Stack. Daher müssen wir sie nicht neu schreiben. – ravindu1024