Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/210.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
更改选项卡时调用了Android fragment oncreateview_Android_Tabs_Android Fragments - Fatal编程技术网

更改选项卡时调用了Android fragment oncreateview

更改选项卡时调用了Android fragment oncreateview,android,tabs,android-fragments,Android,Tabs,Android Fragments,我使用Android已经有一段时间了,但是片段对我来说有点陌生(可能对大多数人来说也是如此)。无论如何,我有下面的代码,它工作得很好。我有三个碎片,每个标签上一个。我想知道每次切换选项卡时调用onCreateView是否正常,这样做有意义吗?难道不应该有一种方法在每次选项卡更改时都不重新绘制片段吗 我把它从一个有3个活动的应用程序转换过来,每个选项卡中都有一个活动,每次选项卡更改时重新创建视图似乎是一种浪费,而在选项卡更改之间存在视图过去是很好的 顺便说一句,此代码借用自: public类选项卡

我使用Android已经有一段时间了,但是片段对我来说有点陌生(可能对大多数人来说也是如此)。无论如何,我有下面的代码,它工作得很好。我有三个碎片,每个标签上一个。我想知道每次切换选项卡时调用onCreateView是否正常,这样做有意义吗?难道不应该有一种方法在每次选项卡更改时都不重新绘制片段吗

我把它从一个有3个活动的应用程序转换过来,每个选项卡中都有一个活动,每次选项卡更改时重新创建视图似乎是一种浪费,而在选项卡更改之间存在视图过去是很好的

顺便说一句,此代码借用自:

public类选项卡扩展了FragmentActivity实现
TabHost.OnTabChangeListener{
最终字符串映射\u TAB=“映射”;
最终字符串图像\u TAB=“图像”;
最终字符串设置\u TAB=“设置”;
TabHost-mTabHost;
HashMap mapTabInfo=新HashMap();
TabInfo mLastTab=null;
私有类TabInfo{
私有字符串标签;
私家级CLS;
私有包args;
私有片段;
TabInfo(字符串标记、类clazz、包参数){
this.tag=tag;
this.clss=clazz;
this.args=args;
}
}
类TabFactory实现TabContentFactory{
私有最终上下文mContext;
公共选项卡工厂(上下文){
mContext=上下文;
}
公共视图createTabContent(字符串标记){
视图v=新视图(mContext);
v、 设置最小宽度(0);
v、 设置最小高度(0);
返回v;
}
}
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
requestWindowFeature(窗口。功能\u无\u标题);
setContentView(R.layout.main);
initialiseTabHost(savedInstanceState);
如果(savedInstanceState!=null)
mTabHost.setCurrentTabByTag(savedInstanceState.getString(“tab”);//根据保存的状态设置选项卡
}
SaveInstanceState上受保护的无效(束超出状态){
outState.putString(“tab”,mTabHost.getCurrentTabTag());//保存选定的选项卡
super.onSaveInstanceState(超出状态);
}
私有void initialiseTabHost(Bundle args){
mTabHost=(TabHost)findViewById(android.R.id.TabHost);
mTabHost.setup();
TabInfo-TabInfo;
Tabs.addTab(这个,
mTabHost,
mTabHost.newTabSpec(映射选项卡).setIndicator(
“地图”选项卡,
getResources().getDrawable(R.drawable.ic_选项卡_映射_状态)),
(tabInfo=newtabinfo(MAP_选项卡,HMapFragment_new.class,args));
mapTabInfo.put(tabInfo.tag,tabInfo);
Tabs.addTab(这个,
mTabHost,
mTabHost.newTabSpec(图像选项卡).setIndicator(
“图像”选项卡,
getResources().getDrawable(R.drawable.ic_选项卡_画廊_状态)),
(tabInfo=newtabinfo(IMAGES_选项卡,ImageGridFragment.class,args));
mapTabInfo.put(tabInfo.tag,tabInfo);
Tabs.addTab(这个,
mTabHost,
mTabHost.newTabSpec(设置选项卡).setIndicator(
“设置”选项卡,
getResources().getDrawable(R.drawable.ic_选项卡设置状态)),
(tabInfo=newtabinfo(SETTINGS_TAB,SettingsFragment.class,args));
mapTabInfo.put(tabInfo.tag,tabInfo);
//默认设置为第一个选项卡
此.onTabChanged(映射选项卡);
mTabHost.setOnTabChangedListener(此);
}
私有静态void addTab(选项卡活动,TabHost TabHost,TabHost.TabSpec TabSpec,TabInfo TabInfo){
//将选项卡视图工厂附着到等级库
tabSpec.setContent(activity.new TabFactory(activity));
String tag=tabSpec.getTag();
//检查一下,看看我们是否已经有了这个标签的一个片段,可能吧
//从以前保存的状态。如果是,请将其停用,因为
//初始状态是不显示选项卡。
tabInfo.fragment=activity.getSupportFragmentManager().findFragmentByTag(标记);
if(tabInfo.fragment!=null&&!tabInfo.fragment.isDetached()){
FragmentTransaction ft=activity.getSupportFragmentManager().beginTransaction();
ft.detach(tabInfo.fragment);
ft.commit();
activity.getSupportFragmentManager().executePendingTransactions();
}
tabHost.addTab(tabSpec);
}
已更改的公用void onTabChanged(字符串标记){
TabInfo newTab=this.mapTabInfo.get(标记);
//如果他们单击以更改选项卡
如果(mLastTab!=newTab){
FragmentTransaction ft=this.getSupportFragmentManager().beginTransaction();
如果(mLastTab!=null)
如果(mLastTab.fragment!=null)ft.detach(mLastTab.fragment);
if(newTab!=null){
if(newTab.fragment==null){
newTab.fragment=fragment.instantiate(this,newTab.clss.getName(),newTab.args);
ft.add(R.id.realtabcontent,newTab.fragment,newTab.tag);
}附加(新标签碎片);
}
mLastTab=newTab;
ft.commit();
此.getSupportFragmentManager().executePendingTransactions();
}
}
}

从视图中删除片段有三种方法:

  • 隐藏它(
    Hide
    transaction对象上的函数)
  • 分离它(
    Detach
    事务对象上的函数)
  • 删除它(
    Remove
    事务对象上的函数)

如果隐藏它,视图将被隐藏,但仍在布局中,应保持完整。如果拆离它,视图将被拆下,但片段仍由FragmentManager管理(例如,在配置更改时将重新创建)。如果您删除它将从FragmentManager中完全删除,它的状态将不再被管理。

因此,也许我应该尝试将上面的分离调用更改为隐藏?显然还需要将attach更改为add,但这正是我想要的!谢谢确切地说,为什么我用这么多hahaI认为它应该是“秀”,实际上。首先添加所有选项卡一次,
public class Tabs extends FragmentActivity implements
    TabHost.OnTabChangeListener {

final String MAP_TAB = "Map";
final String IMAGES_TAB = "Images";
final String SETTINGS_TAB = "Settings";

TabHost mTabHost;
HashMap<String, TabInfo> mapTabInfo = new HashMap<String, TabInfo>();
TabInfo mLastTab = null;

private class TabInfo {
    private String tag;
    private Class clss;
    private Bundle args;
    private Fragment fragment;
    TabInfo(String tag, Class clazz, Bundle args) {
        this.tag = tag;
        this.clss = clazz;
        this.args = args;
    }

}

class TabFactory implements TabContentFactory {

    private final Context mContext;

    public TabFactory(Context context) {
        mContext = context;
    }

    public View createTabContent(String tag) {
        View v = new View(mContext);
        v.setMinimumWidth(0);
        v.setMinimumHeight(0);
        return v;
    }

}

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    setContentView(R.layout.main);

    initialiseTabHost(savedInstanceState);
    if (savedInstanceState != null)
        mTabHost.setCurrentTabByTag(savedInstanceState.getString("tab")); //set the tab as per the saved state
}

protected void onSaveInstanceState(Bundle outState) {
    outState.putString("tab", mTabHost.getCurrentTabTag()); //save the tab selected
    super.onSaveInstanceState(outState);
}

private void initialiseTabHost(Bundle args) {
    mTabHost = (TabHost)findViewById(android.R.id.tabhost);
    mTabHost.setup();
    TabInfo tabInfo;

    Tabs.addTab(this,
            mTabHost,
            mTabHost.newTabSpec(MAP_TAB).setIndicator(
                    MAP_TAB,
                    getResources().getDrawable(R.drawable.ic_tab_map_states)),
            ( tabInfo = new TabInfo(MAP_TAB, HMapFragment_NEW.class, args)));
    mapTabInfo.put(tabInfo.tag, tabInfo);

    Tabs.addTab(this,
            mTabHost,
            mTabHost.newTabSpec(IMAGES_TAB).setIndicator(
                    IMAGES_TAB,
                    getResources().getDrawable(R.drawable.ic_tab_gallery_states)),
            ( tabInfo = new TabInfo(IMAGES_TAB, ImageGridFragment.class, args)));
    mapTabInfo.put(tabInfo.tag, tabInfo);

    Tabs.addTab(this,
            mTabHost,
            mTabHost.newTabSpec(SETTINGS_TAB).setIndicator(
                    SETTINGS_TAB,
                    getResources().getDrawable(R.drawable.ic_tab_settings_states)),
            ( tabInfo = new TabInfo(SETTINGS_TAB, SettingsFragment.class, args)));
    mapTabInfo.put(tabInfo.tag, tabInfo);

    // Default to first tab
    this.onTabChanged(MAP_TAB);
    mTabHost.setOnTabChangedListener(this);
}

private static void addTab(Tabs activity, TabHost tabHost, TabHost.TabSpec tabSpec, TabInfo tabInfo) {
    // Attach a Tab view factory to the spec
    tabSpec.setContent(activity.new TabFactory(activity));
    String tag = tabSpec.getTag();

    // Check to see if we already have a fragment for this tab, probably
    // from a previously saved state.  If so, deactivate it, because our
    // initial state is that a tab isn't shown.
    tabInfo.fragment = activity.getSupportFragmentManager().findFragmentByTag(tag);
    if (tabInfo.fragment != null && !tabInfo.fragment.isDetached()) {
        FragmentTransaction ft = activity.getSupportFragmentManager().beginTransaction();
        ft.detach(tabInfo.fragment);
        ft.commit();
        activity.getSupportFragmentManager().executePendingTransactions();
    }

    tabHost.addTab(tabSpec);
}

public void onTabChanged(String tag) {
    TabInfo newTab = this.mapTabInfo.get(tag);
    // if they've clicked to change tabs
    if (mLastTab != newTab) {
        FragmentTransaction ft = this.getSupportFragmentManager().beginTransaction();
        if (mLastTab != null)
            if (mLastTab.fragment != null) ft.detach(mLastTab.fragment);
        if (newTab != null) {
            if (newTab.fragment == null) {
                newTab.fragment = Fragment.instantiate(this, newTab.clss.getName(), newTab.args);
                ft.add(R.id.realtabcontent, newTab.fragment, newTab.tag);
            } else ft.attach(newTab.fragment);
        }

        mLastTab = newTab;
        ft.commit();
        this.getSupportFragmentManager().executePendingTransactions();
    }
}
}