java - 安卓设置 fragment

标签 java android android-activity settings preferences

我正在尝试向我的 android-app 添加一个设置 fragment 。 所以,我添加了一个 xml 文件和这个 Activity :

public class SettingsActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // Display the fragment as the main content.
    getFragmentManager().beginTransaction()
            .replace(android.R.id.content, new SettingsFragment())
            .commit();
}

public static class SettingsFragment extends PreferenceFragment {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // Load the preferences from an XML resource
        addPreferencesFromResource(R.xml.preferences);
    }
}
}

它是从主 Activity 中的 onOptionsItemSelected 函数调用的:

if (id == R.id.action_settings) {
        Intent intent = new Intent(this, SettingsActivity.class);
        startActivity(intent);
        return true;
    }

所以,现在,当我尝试从菜单中打开 Activity 时,它强制关闭并且我在控制台中收到此错误:

Force-removing child win Window{4190a9a8 u0 PopupWindow:418fc208} from container         Window{418dd448 u0 org.name.app/org.name.app.MainActivity}
Failed looking up window
java.lang.IllegalArgumentException: Requested window android.os.BinderProxy@423b1fc0 does not exist
        at com.android.server.wm.WindowManagerService.windowForClientLocked(WindowManagerService.java:7934)
        at com.android.server.wm.WindowManagerService.windowForClientLocked(WindowManagerService.java:7925)
        at com.android.server.wm.WindowState$DeathRecipient.binderDied(WindowState.java:1047)
        at android.os.BinderProxy.sendDeathNotice(Binder.java:493)
        at dalvik.system.NativeStart.run(Native Method)

最佳答案

您正在替换以前从未添加过的 fragment ......

getFragmentManager().beginTransaction()
            .replace(android.R.id.content, new SettingsFragment())
            .commit();

尝试

            .add(android.R.id.content, new SettingsFragment())

但是正确的代码应该是(伪代码)

  1. 通过 id 或标签查找 fragment
  2. 如果找到的 fragment 为空,则创建一个。

您可以在网络和 stackoverflow 上找到大量示例。 ;)

更新 好的,这里有一些示例代码供您用作起点。

假设:您对多个 fragment 使用相同的 Activity ,因此您需要恢复现有的或创建一个新的。

FragmentManager fm = getSupportFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
Fragment newFragment = fm.findFragmentByTag("Some_Tag");
if (newFragment == null) {
     newFragment = SomeFragment.newInstance(); //create a new frag
}
// Find the old one to know if we have to replace or simply add to this container
Fragment oldFragment = fm.findFragmentById(R.id.content_container);
if (oldFragment != null) {
    ft.replace(R.id.content_container, newFragment, "Some_Tag");
} else {
    ft.add(R.id.content_container, newFragment, "Some_Tag");
}
// optionally use a nice transition
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
// …and to the backstack if you wish…
ft.addToBackStack(null).commit();

另一方面,如果您只想要没有任何花哨的简单版本……

FragmentManager fm = getSupportFragmentManager();//if using support lib
Fragment fragment = fm.findFragmentById(R.id.your_container);
if (fragment == null) {
   fragment = YourFragment.newInstance();
   fm.beginTransaction()
   .add(R.id.your_container, fragment, "some_tag_if_you_wish_to_use_find_by_tag_later")
   .commit();
}

如果容器没有 fragment ,这只会添加 fragment 。否则没有什么可以做的,因为容器已经有了你的 fragment 。 :)

关于java - 安卓设置 fragment ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20749009/

相关文章:

android - 在不破坏底部 Activity 的情况下返回一些 Activity

Java - 简单游戏的设计建议

java - "Exception in thread "主要 "java.util.InputMismatchException"**

android - 在不更改扩展文件的情况下更新 Google Play 中的 APK

android - 将相同的 ImageView 多次添加到布局

android 在条件下启动 Activity

Android:在 NDEF_DISCOVERED 操作上注册的 Activity 被忽略

java - 如何评估脚本中的 Groovy 字符串?

java - 尝试清除 JavaFX ObservableMap 时出现 ConcurrentException

java - 为什么我的闹钟不起作用?