1 つのアクティビティと多くのフラグメントを含む小さなアプリがあります。SherlockFragment を使用しています。私の問題は、フラグメントのインスタンスを保存して、特別な navlist アイテムに表示される最後のフラグメントを取得する方法がわからないことです。
例: navlist 項目、たとえば「info」を選択します。次に、FragmentA を取得します。FragmentA は SherlockListFragment から拡張されているため、ListItem を選択して FragmentB を取得できます。FragmentB も SherlockListFragment から拡張されているため、FragmentC などを取得します。
問題は次のとおりです。「ホーム」などの別の navlist 項目を選択すると、FragmentD が表示されます。ここで、navlist 項目 "info" を再度選択すると、FragmentC が表示されるようになります。
私のコード スニペットでは、フラグメントを置き換えるだけですが、どのフラグメントが最後に表示されたかを知る必要があります。
私のSherlockFragmentActivity:
public class MainActivity extends SherlockFragmentActivity implements ActionBar.OnNavigationListener{
private FragmentHome mFragmentHome = null;
private FragmentInfo mFragmentInfo = null;
private static final String mListItemHome = "starthome";
private static final String mListItemInfo = "startinfo";
public void onCreate(Bundle savedInstanceState) {
setTheme(R.style.My_Theme);
super.onCreate(savedInstanceState);
setContentView(R.layout.main_fragment);
getSupportActionBar().setDisplayShowTitleEnabled(false);
getSupportActionBar().setHomeButtonEnabled(false);
getSupportActionBar().setDisplayHomeAsUpEnabled(false);
Context context = getSupportActionBar().getThemedContext();
// Navlist
ArrayAdapter<CharSequence> list = ArrayAdapter.createFromResource(context,
R.array.locations, R.layout.sherlock_spinner_dropdown_item);
list.setDropDownViewResource(R.layout.sherlock_spinner_dropdown_item);
getSupportActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
getSupportActionBar().setListNavigationCallbacks(list, this);
mFm = getSupportFragmentManager();
//Init of my Fragments:
mFragmentHome = new FragmentHome();
mFragmentInfo = new FragmentInfo();
}
@Override
public boolean onNavigationItemSelected(int itemPosition, long itemId) {
FragmentTransaction ft = mFm.beginTransaction();
switch(itemPosition){
case 0:
ft.replace(R.id.fragment_content, mFragmentHome);
ft.addtoBackStack(mListHome);
ft.commit();
return true;
case 1:
ft.replace(R.id.fragment_content, mFragmentInfo);
ft.addtoBackStack(mListInfo);
ft.commit();
return true;
default:
return false;
}
}
}
私のフラグメントは次のようになります。
public class FragmentInfo extends SherlockListFragment{
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//disable the HomeButton as "Up"-Button
ActionBar actionBar = getSherlockActivity().getSupportActionBar();
actionBar.setHomeButtonEnabled(false);
actionBar.setDisplayHomeAsUpEnabled(false);
...
}
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
Bundle bundle = new Bundle();
bundle.putString("x", x );
bundle.putString("y", y);
FragmentManager fm = getFragmentManager();
FragmentInfo fragment = new FragmentInfo(fm);
fragment.setArguments(bundle);
FragmentTransaction ft = fm.beginTransaction();
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
ft.replace(R.id.fragment_content, fragment);
ft.addToBackStack("info");
ft.commit();
}
}
私は本当に一日中解決策を探しましたが、私を助けることができるものは見つかりませんでした. タブには次のようなものが必要だと思います: Actionbarsherlock + タブ + マルチフラグメント? または、リストの TabHost のようなもの...
あなたが私を助けてくれることを願っています。
敬具
編集:
非表示と表示の問題が発生しました。私の xml-layout には、id: fragment_content の Framelayout があります。この ID は、あるフラグメントを別のフラグメントに置き換えるために常に使用されていました。今度は、ID が fragment_info の別の Framelayout を追加します。FragmentManager で置き換えた最後の Fragment を取得するためにこれを行いました。
さて、私のNavigationItemSelectedメソッドは次のようになります:
@Override
public boolean onNavigationItemSelected(int itemPosition, long itemId) {
FragmentTransaction ft = mFm.beginTransaction();
switch(itemPosition){
case 0:
if(mFragmentHome==null){
mFragmentHome = new FragmentHome();
ft.replace(R.id.fragment_content, mFragmentHome)
ft.addToBackStack(mListItemHome);
ft.commit();
}else{
if(mFragmentHome.isHidden()){
ft.show(mFragmentHome);
ft.replace(R.id.fragment_content, mFragmentHome)
ft.addToBackStack(mListItemHome);
ft.commit();
}
ft.hide(mFragmentInfo);
}
case 1:
if(mFragmentInfo==null){
mFragmentInfo = new FragmentInfo();
ft.replace(R.id.fragment_info, mFragmentInfo)
ft.addToBackStack(mListItemInfo);
ft.commit();
ft.hide(mFragmentHome)
}else{
ft.hide(mfragmentHome();
//here I get the last Fragment I choose under the navlist-Item "Info"
Fragment f = getFragmentManager.findFragmentById(R.id.fragment_info);
ft.replace(R.id.fragment_info, f);
ft.addToBackStack(mListItemInfo);
ft.commit();
}
ft.hide(mFragmentHome);
default:
return false;
}
}
}
私のxml:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<FrameLayout
android:id="@+id/fragment_content"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<FrameLayout
android:id="@+id/fragment_info"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>
しかし今、戻るボタンに別の問題があります。メニュー情報を選択し、FragmentA、FragmentB、FragmentC をブラウズすると、navlist-Item "Home" を選択し、再び navlist-Item "Info" を選択すると、FragmentC が表示されます。しかし、BackButton を押すと、Activity は破棄されます。
しかし、BackButton を押した後に FragmentB -> FragmentA が来て、Activity を終了できるようにしたいと考えています。
戻るボタンを無効にできることはわかっていますが、間違いを犯していると思います。おそらく、デタッチとアタッチで作業する必要がありますか?もっと簡単な方法があるはずだと思いますよね?