Jun*_*aso 10 android screen-orientation android-fragments actionbarsherlock android-actionbar
我有一个活动有多个碎片.我也使用actionbarSherlock作为我的标签,它也连接到片段.
我的问题是当我要旋转屏幕时(即纵向为横向/反之亦然),我的活动将再次被调用,以便重新启动我的活动.
我不想重新启动我的活动,只是恢复旋转之前显示的当前片段.请不要回答,android:configChanges="orientation|keyboardHidden"因为它没有解决问题,但就像一个简单的黑客.我的解决方案是OnsaveInstanceState和onRestoreInstanceState方法,但我只是不知道如何将它与我的问题一起使用.请帮帮我这个.任何回应都非常感谢.
码:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ActionBar actionBar = getSupportActionBar();
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
ActionBar.Tab tabA = actionBar.newTab().setIcon(R.drawable.about);
ActionBar.Tab tabE = actionBar.newTab().setIcon(R.drawable.faq);
ActionBar.Tab tabB = actionBar.newTab().setIcon(R.drawable.sponsors);
ActionBar.Tab tabC = actionBar.newTab().setIcon(R.drawable.map);
ActionBar.Tab tabD = actionBar.newTab().setIcon(R.drawable.destination);
Fragment aboutTab = new PhotosActivity();
Fragment sponsorTab = new SongsActivity();
Fragment mapTab = new HCCMapActivity();
Fragment questTab = new FaqActivity();
Fragment DestinationTab = new TourActivity();
tabA.setTabListener(new MyTabsListener(aboutTab));
tabB.setTabListener(new MyTabsListener(sponsorTab));
tabC.setTabListener(new MyTabsListener(mapTab));
tabD.setTabListener(new MyTabsListener(DestinationTab));
tabE.setTabListener(new MyTabsListener(questTab));
actionBar.addTab(tabD, 0, true);
actionBar.addTab(tabC, 1, false);
actionBar.addTab(tabA, 2, false);
actionBar.addTab(tabB, 3, false);
actionBar.addTab(tabE, 4, false);
}
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
super.onSaveInstanceState(savedInstanceState);
// Save UI state changes to the savedInstanceState.
// This bundle will be passed to onCreate if the process is
// killed and restarted.
savedInstanceState.putString("MyString", "Welcome back to Android");
//savedInstanceState.putString("id",)
// etc.
//getSupportFragmentManager().putFragment(savedInstanceState, "fragment", getSupportFragmentManager().findFragmentById(R.id.fragment_place));
}
@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
FragmentManager fragmentManager ;
FragmentTransaction ft ;
super.onRestoreInstanceState(savedInstanceState);
// Restore UI state from the savedInstanceState.
// This bundle has also been passed to onCreate.
String myString = savedInstanceState.getString("MyString");
Log.i("Hello", myString);
fragmentManager = getSupportFragmentManager();
ft = fragmentManager.beginTransaction();
ft.setCustomAnimations(R.anim.slide_out_left, R.anim.slide_out_right);
ft.replace(R.id.fragment_place, getSupportFragmentManager().getFragment(savedInstanceState, "fragment"), null);
}
@Override
public void onConfigurationChanged (Configuration newConfig){
Log.i("hello", "Config");
super.onConfigurationChanged(newConfig);
}
@Override
public boolean onPrepareOptionsMenu (Menu menu) {
//MenuItem menuitem1 = menu.findItem(R.id.menuitem1);
//menuitem1.setVisible(false);
menu.getItem(1).setVisible(false);
menu.getItem(0).setVisible(false);
return true;
}
protected class MyTabsListener implements TabListener{
Fragment fragment;
public MyTabsListener(Fragment fragment){
this.fragment = fragment;
}
public void onTabSelected(Tab tab, FragmentTransaction ft) {
if (myTabPosition < 0){
//ft.setCustomAnimations(android.R.animator.fade_in, android.R.animator.fade_out);
}else{
if (myTabPosition > tab.getPosition()){
ft.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_right);
}else{
ft.setCustomAnimations(R.anim.slide_out_left, R.anim.slide_out_right);
}
}
myTabPosition = tab.getPosition();
ft.replace(R.id.fragment_place, fragment, null);
//ft.commit();
}
public void onTabUnselected(Tab tab, FragmentTransaction ft) {
// TODO Auto-generated method stub
ft.remove(fragment);
getSupportFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
}
public void onTabReselected(Tab tab, FragmentTransaction ft) {
// TODO Auto-generated method stub
}
}
Run Code Online (Sandbox Code Playgroud)
Mic*_*ley 15
默认情况下,如果不再添加片段,则会在设备轮换后恢复片段.如果你想在片段看起来是一样的,那么你应该执行你onSaveInstanceState的Fragment本身.在Activity你可以做的事情,如:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if(savedInstanceState == null) {
/* First launch, add fragments */
} else {
/*
Activity restored, don't add new fragments or in your case,
don't make the first tab selected.
*/
}
}
Run Code Online (Sandbox Code Playgroud)
即使您未onSaveInstanceState在活动中覆盖,savedInstanceState恢复时该参数仍将为非null Activity.它只是一个空洞的Bundle.
另一种选择是存储选定的选项卡索引,并在恢复活动时重新选择该选项卡.
@Override
public void onSaveInstanceState(Bundle outState) {
outState.putInt("CurrentTab", currentTabIndex);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
/* Your existing code */
if(savedInstanceState != null) {
int currentTab = savedInstanceState.getInt("CurrentTab", 0);
/* Set currently selected tab */
}
}
Run Code Online (Sandbox Code Playgroud)
这将重新选择当前选项卡并显示Fragment正在显示的选项卡.唯一的缺点是你的片段状态没有保存.要保存片段的状态,您必须执行类似第一个解决方案的操作.
| 归档时间: |
|
| 查看次数: |
16204 次 |
| 最近记录: |