关闭PreferenceFragment

6

我已经搜索了几个小时,但没有找到我理解/寻找的答案。

我有一个偏好设置屏幕,在用户点击菜单中的设置时打开。这已经可以工作了。 但是,当用户完成设置后,如何最好地使其关闭此屏幕呢?

我喜欢 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>

按下返回按钮怎么样?它应该是这样工作的。 - Phantômaxx
然后他关闭整个应用程序。 - Ricardo di Stefano
不是的,那是如果你按了两次。或者如果你在onBackPressed中放置了代码来结束你的应用程序。不要混淆Back和Home... - Phantômaxx
我认为将MainActivity作为preferences的parentActivity,就像Child Activities一样。但是如果可能的话,在清单文件中如何实现呢? - Ricardo di Stefano
我只按了一次回车键。 - Ricardo di Stefano
所以!偏好设置 Activity 是您的启动器?如果您想要一个主 Activity 和一个偏好设置 Activity,那么它可以按照我说的方式工作。我认为这就是我想要的。所以,用几行话很难说清楚,我必须给出一个答案…… - Phantômaxx
4个回答

11
被接受的答案是不正确的。通过执行: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(前一个 Activity)的堆栈上。


1
这是正确的答案,应该被接受。PreferenceActivity类已经有了管理添加/删除PreferenceFragments到堆栈的实现,因此我们不需要重写它。 - ravindu1024

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

现在,当有人按下返回按钮时,交易将被记住并撤销。

我表达不够明确,很抱歉。我的意思是,在清单中设置为父级的活动中调用的左上角按钮。标准返回按钮可以正常使用,但有些用户更喜欢使用另一个按钮。 - Ricardo di Stefano

0
将MainActivity设置为Preferences的父Activity:
假设您已经在res/xml文件夹中拥有了prefs.xml(或任何您喜欢的名称)文件:
在Manifest文件中声明您的活动(在应用程序部分):
<!-- 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));

我不得不在主活动和片段之间添加一个活动,但它可以工作。 - Ricardo di Stefano
当然,我跳过了它是PreferenceFragment的部分...我假设它是PreferenceActivity。所以,你添加了一个打开Fragment的PreferenceActivity,这很好。;) - Phantômaxx
如何让应用在实现不同活动的设置时,当用户点击左上角的返回按钮时返回到上一个活动? - Ricardo di Stefano
通过点击返回按钮,PreferenceScreen 将关闭并且您将返回到后退栈中最后打开的片段。 - Phantômaxx

0

不用创建新的活动,只需覆盖首选项片段的布局并填充一个带有按钮的布局。然后监听按钮点击事件以关闭片段。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接