2013-12-23 100 views
4

我試圖添加一個設置片段到我的android-app。 所以,我增加了一個XML文件和本次活動:Android設置片段

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

它正在從onOptionsItemSelected函數調用中的主要活動:

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

所以,現在,當我嘗試打開從菜單中的活動,它強制關閉,我在控制檯中得到這個錯誤:

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 [email protected] 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) 

回答

3

您正在更換一個片段臨時如果發現■禁止前加入...

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

嘗試

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

但正確的代碼應該是(僞代碼)

  1. 查找ID或標籤
  2. 片段片段是空,然後創建一個。

你可以找到很多圍繞net和stackoverflow的例子。 ;)

UPDATE好的,這裏有一些示例代碼供您使用作爲起點。

假設:您對多個片段使用相同的活動,因此您需要恢復現有的或創建一個新的片段。

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

這隻會增加的片段,如果容器沒有它。否則,因爲容器已經有你的片段,所以還沒有做任何事情要做。 :)

+0

我用add函數代替了替換功能,但它也不管用。我是否需要找到舊片段並將其替換爲新片段,或者我做錯了什麼? – ovmcit5eoivc4

1

錯誤消息指示活動層次結構存在一些問題。嘗試使MainActivity成爲SettingsActivity的父項。除了我提到的父母關係外,我使用的是相同的代碼;它適用於我。

您可以設置父relatioship這樣的:

<activity 
      android:name="some.package.SettingsActivity" 
      android:label="@string/activity_name_settings" 
      android:parentActivityName="some.package.MainActivity" > 
      <meta-data 
       android:name="android.support.PARENT_ACTIVITY" 
       android:value="some.package.MainActivity" /> 
</activity>