片段无法正常工作取向变化后 [英] Fragments Not Working Correctly After Orientation Change
问题描述
我有碎片问题
和方向的变化。
我有其中有一个应用程序中的 MainActivity
它处理交换了片段
通过标签操作栏。这里是code的标签操作栏,并且在选择一个标签。
私有类MyTabListener<吨延伸android.support.v4.app.Fragment>实现ActionBar.TabListener {
私人android.support.v4.app.Fragment mFragment;
私人最终活动mActivity;
私人最终字符串MTAG;
私人最终类别< T> mClass;
公共MyTabListener(SherlockFragmentActivity活动,字符串变量,类< T> CLZ){
mActivity =活动;
MTAG =标签;
mClass = CLZ;
}
@覆盖
公共无效onTabSelected(TAB键,android.support.v4.app.FragmentTransaction英尺){
如果(mFragment == NULL){//检查是否该片段已被初始化。如果没有创建一个新的。
mFragment = android.support.v4.app.Fragment.instantiate(mActivity,mClass.getName());
ft.add(android.R.id.content,mFragment,MTAG);
} 其他 {
ft.attach(mFragment); //如果该片段已被初始化其附加到当前活动
}
}
@覆盖
公共无效onTabUnselected(TAB键,android.support.v4.app.FragmentTransaction英尺){
如果(mFragment!= NULL){
ft.detach(mFragment); //当一个片段不再需要,从活动的分离,但不破坏它
}
}
@覆盖
公共无效onTabReselected(TAB键,android.support.v4.app.FragmentTransaction英尺){
}
我看到它的方式是,一切都正常工作时,在人像模式中的应用程序首次加载。当我旋转,由于某种原因,片段1的另一个实例
添加,然后在选择其它选项卡不沾边。这也是如此,当我再旋转回肖像。
我一直使用 setRetainInstance(真)尝试;
在我的片段
但这不起作用。
有没有一种方法,我需要重写或做一些与我的片段
旋转过吗?
在此先感谢。
修改我现在已经看到onTabSelected再次调用活动时重建。难道这是我的问题,碎片附着不止一次的原因是什么?
下面是我的活动onCreate方法。
super.onCreate(savedInstanceState);
如果(savedInstanceState == NULL){
//setContentView(R.layout.main);
}
//创建操作栏与标签
动作条动作条= getSupportActionBar();
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
actionBar.setDisplayShowTitleEnabled(假);
//创建一个跟踪选项卡并将其添加到操作栏。
TAB键= actionBar.newTab()
.setText(跟踪)
.setTabListener(新MyTabListener< TrackingFragment>(这一点,跟踪,TrackingFragment.class));
actionBar.addTab(标签);
//创建一个滑雪道的选项卡并将其添加到操作栏。
标签= actionBar.newTab()
.setText(某事曲目)
.setTabListener(新MyTabListener< TrackListFragment>(这一点,somethingtracks,TrackListFragment.class));
actionBar.addTab(标签);
//创建照片的选项卡并将其添加到操作栏。
标签= actionBar.newTab()
.setText(照片)
.setTabListener(新MyTabListener<光碎片>(这一点,照片,PhotoFragment.class));
actionBar.addTab(标签);
短FIX:
在 onTabSelected
法,使用前如果(mFragment == NULL)
你需要尝试获得片段(使用 mFragment = getSupportFragmentManager()。findFragmentByTag(MTAG)
)。您还可以设置这个从外面,但我没有看到你这样做。
检查如果(savedInstanceState == NULL)
在的onCreate
也可以解决这个问题,我认为这是一个更好的方法虽然! :)
I am having a problem with Fragments
and orientation change.
I have an application which has a MainActivity
which handles the switching up Fragments
via a tabbed action bar. Here is the code for the tabbed action bar and when a tab is selected.
private class MyTabListener <T extends android.support.v4.app.Fragment> implements ActionBar.TabListener {
private android.support.v4.app.Fragment mFragment;
private final Activity mActivity;
private final String mTag;
private final Class<T> mClass;
public MyTabListener(SherlockFragmentActivity activity, String tag, Class<T> clz) {
mActivity = activity;
mTag = tag;
mClass = clz;
}
@Override
public void onTabSelected(Tab tab, android.support.v4.app.FragmentTransaction ft) {
if (mFragment == null){ // check to see if the fragment has already been initialised. If not create a new one.
mFragment = android.support.v4.app.Fragment.instantiate(mActivity, mClass.getName());
ft.add(android.R.id.content,mFragment,mTag);
} else {
ft.attach(mFragment); // if the fragment has been initialised attach it to the current activity
}
}
@Override
public void onTabUnselected(Tab tab, android.support.v4.app.FragmentTransaction ft) {
if (mFragment != null){
ft.detach(mFragment); // when a fragment is no longer needed, detach it from the activity but dont destroy it
}
}
@Override
public void onTabReselected(Tab tab, android.support.v4.app.FragmentTransaction ft) {
}
The way I see it is that everything works fine when the application first loads in portrait mode. When I rotate, for some reason another instance of Fragment1
is added and then isn't detached when another tab is selected. This is also the case when I then rotate back to portrait.
I have tried using setRetainInstance(true);
in my Fragments
but this doesn't work.
Is there a method I need to override or do something with my Fragments
before rotating?
Thanks in advance.
EDIT I have now seen that onTabSelected is called again when the activity is recreated. Could this be the cause of my problem with fragments being attached more than once?
Here is my activities onCreate method.
super.onCreate(savedInstanceState);
if (savedInstanceState == null) {
//setContentView(R.layout.main);
}
// Create the Action Bar with tabs
ActionBar actionBar = getSupportActionBar();
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
actionBar.setDisplayShowTitleEnabled(false);
//create the tab for track and add it to the action bar.
Tab tab = actionBar.newTab()
.setText("Track")
.setTabListener(new MyTabListener<TrackingFragment>(this,"track",TrackingFragment.class));
actionBar.addTab(tab);
//create the tab for ski tracks and add it to the action bar.
tab = actionBar.newTab()
.setText("Something Tracks")
.setTabListener(new MyTabListener<TrackListFragment>(this,"somethingtracks",TrackListFragment.class));
actionBar.addTab(tab);
//create the tab for photos and add it to the action bar.
tab = actionBar.newTab()
.setText("Photos")
.setTabListener(new MyTabListener<PhotoFragment>(this,"photos",PhotoFragment.class));
actionBar.addTab(tab);
Short fix:
In the onTabSelected
method, before using if (mFragment == null)
you need to try to get the fragment (using mFragment = getSupportFragmentManager().findFragmentByTag(mTag)
). You can also set this from the outside but I don't see you doing this.
Checking if(savedInstanceState == null)
on onCreate
could also solve this and I consider it a better approach though! :)
这篇关于片段无法正常工作取向变化后的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!