Android Studio 1.1.2
您好,
我有MainActivity,TitlesFragment和DetailsFragment。
我的MainActivity将显示TitlesFragment,当用户点击标题时,TitlesFragment将被DetailsFragment替换。这很好。但是,当我将DetailsFragment添加到addToBackStack时。当我单击后退按钮时,它将关闭应用程序,而不是显示TitlesFragment。
我在考虑我需要2个活动。一个用于TilesFragment,另一个用于DetailsFragment?目前我正试图通过一项活动来做到这一点吗?
目前这是MainActivity的代码片段(仅显示片段事务)
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d(TAG, "onCreate");
setContentView(R.layout.activity_main);
/* Load ListFragment */
FragmentManager fragmentManager = getFragmentManager();
Fragment fragment = fragmentManager.findFragmentById(R.id.fragment_container);
/* If the fragment is null then we need to load this fragment */
if(fragment == null) {
fragment = TitlesFragment.newInstance(1234);
FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
fragmentTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
fragmentTransaction.add(R.id.fragment_container, fragment, "TitlesFragment");
fragmentTransaction.commit();
}
}
@Override
public void onColorPlateSelected(long plateID) {
Log.d(TAG, "onColorPlateSelected: " + plateID);
/* Get the plate ID and pass it to the details fragment */
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
/* Replace the fragment with the new color plate */
fragmentTransaction.replace(R.id.fragment_container, DetailsFragment.newInstance(plateID), "DetailsFragment");
fragmentTransaction.addToBackStack(null);
fragmentTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
fragmentTransaction.commit();
}
我对activity_main的布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<FrameLayout
android:id="@+id/fragment_container"
android:layout_width="match_parent"
android:layout_height="match_parent">
</FrameLayout>
这里ActivityMain将替换framelayout中的片段。
我通过处理OnBackPressed事件处理程序看到了这一点。但我想知道如果没有它我能做到吗?
非常感谢任何建议,
答案 0 :(得分:1)
尝试将相同的addToBackStack()方法添加到您添加到活动的第一个列表片段中。即。
fragment = TitlesFragment.newInstance(1234);
FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
fragmentTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
fragmentTransaction.add(R.id.fragment_container, fragment, "TitlesFragment");
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
然后应该阻止第二个片段在后栈中替换它。
答案 1 :(得分:1)
我设法解决了这个问题。我的主要活动的签名是:
public class MainActivity extends ActionBarActivity {
..
}
我正在扩展MainActivity以继承ActionBarActivity。但是,当我将类签名更改为:
public class MainActivity extends Activity {
..
}
一切都按预期工作,我可以使用backButton从detailsFragment导航到titlesFragment。
不确定为什么会这样,也许在使用片段时,动作栏最好在片段本身而不是在主要活动中实现。
希望这可以帮助别人