栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Android FragmentTabHost-尚未完全成熟吗?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Android FragmentTabHost-尚未完全成熟吗?

我终于明白了这一点。FragmentTabHost.java存在一个问题,该问题将始终为您创建一个TabHost元素,无论您用XML定义什么并事先进行膨胀。

因此,在编写自己的FragmentTabHost.java版本时,我注释掉了那部分代码。

确保在XML布局中使用此版本的新版本,

<com.example.app.MyFragmentTabHost

并且当然要膨胀它:

Fragment1.java:

mTabHost = (MyFragmentTabHost) view.findViewById(android.R.id.tabhost);mTabHost.setup(getActivity(), getChildFragmentManager(), android.R.id.tabcontent);

MyFragmentTabHost.java:

package com.example.app;import java.util.ArrayList;import android.content.Context;import android.content.res.TypedArray;import android.os.Bundle;import android.os.Parcel;import android.os.Parcelable;import android.support.v4.app.Fragment;import android.support.v4.app.FragmentManager;import android.support.v4.app.FragmentTransaction;import android.util.AttributeSet;import android.view.View;import android.widget.frameLayout;import android.widget.TabHost;public class MyFragmentTabHost extends TabHost    implements TabHost.onTabChangeListener {private final ArrayList<TabInfo> mTabs = new ArrayList<TabInfo>();private frameLayout mRealTabContent;private Context mContext;private FragmentManager mFragmentManager;private int mContainerId;private TabHost.onTabChangeListener mOnTabChangeListener;private TabInfo mLastTab;private boolean mAttached;static final class TabInfo {    private final String tag;    private final Class<?> clss;    private final Bundle args;    private Fragment fragment;    TabInfo(String _tag, Class<?> _class, Bundle _args) {        tag = _tag;        clss = _class;        args = _args;    }}static class DummyTabFactory implements TabHost.TabContentFactory {    private final Context mContext;    public DummyTabFactory(Context context) {        mContext = context;    }    @Override    public View createTabContent(String tag) {        View v = new View(mContext);        v.setMinimumWidth(0);        v.setMinimumHeight(0);        return v;    }}static class SavedState extends baseSavedState {    String curTab;    SavedState(Parcelable superState) {        super(superState);    }    private SavedState(Parcel in) {        super(in);        curTab = in.readString();    }    @Override    public void writeToParcel(Parcel out, int flags) {        super.writeToParcel(out, flags);        out.writeString(curTab);    }    @Override    public String toString() {        return "FragmentTabHost.SavedState{"     + Integer.toHexString(System.identityHashCode(this))     + " curTab=" + curTab + "}";    }    public static final Parcelable.Creator<SavedState> CREATOR = new Parcelable.Creator<SavedState>() {        public SavedState createFromParcel(Parcel in) { return new SavedState(in);        }        public SavedState[] newArray(int size) { return new SavedState[size];        }    };}public MyFragmentTabHost(Context context) {    // Note that we call through to the version that takes an AttributeSet,    // because the simple Context construct can result in a broken object!    super(context, null);    initFragmentTabHost(context, null);}public MyFragmentTabHost(Context context, AttributeSet attrs) {    super(context, attrs);    initFragmentTabHost(context, attrs);}private void initFragmentTabHost(Context context, AttributeSet attrs) {    TypedArray a = context.obtainStyledAttributes(attrs, new int[] { android.R.attr.inflatedId }, 0, 0);    mContainerId = a.getResourceId(0, 0);    a.recycle();    super.setonTabChangedListener(this);        }@Override @Deprecatedpublic void setup() {    throw new IllegalStateException( "Must call setup() that takes a Context and FragmentManager");}public void setup(Context context, FragmentManager manager) {    super.setup();    mContext = context;    mFragmentManager = manager;    ensureContent();}public void setup(Context context, FragmentManager manager, int containerId) {    super.setup();    mContext = context;    mFragmentManager = manager;    mContainerId = containerId;    ensureContent();    mRealTabContent.setId(containerId);    // We must have an ID to be able to save/restore our state.  If    // the owner hasn't set one at this point, we will set it ourself.    if (getId() == View.NO_ID) {        setId(android.R.id.tabhost);    }}private void ensureContent() {    if (mRealTabContent == null) {        mRealTabContent = (frameLayout)findViewById(mContainerId);        if (mRealTabContent == null) { throw new IllegalStateException(         "No tab content frameLayout found for id " + mContainerId);        }    }}@Overridepublic void setonTabChangedListener(onTabChangeListener l) {    monTabChangeListener = l;}public void addTab(TabHost.TabSpec tabSpec, Class<?> clss, Bundle args) {    tabSpec.setContent(new DummyTabFactory(mContext));    String tag = tabSpec.getTag();    TabInfo info = new TabInfo(tag, clss, args);    if (mAttached) {        // If we are already attached to the window, then check to make        // sure this tab's fragment is inactive if it exists.  This shouldn't        // normally happen.        info.fragment = mFragmentManager.findFragmentByTag(tag);        if (info.fragment != null && !info.fragment.isDetached()) { FragmentTransaction ft = mFragmentManager.beginTransaction(); ft.detach(info.fragment); ft.commit();        }    }    mTabs.add(info);    addTab(tabSpec);}@Overrideprotected void onAttachedToWindow() {    super.onAttachedToWindow();    String currentTab = getCurrentTabTag();    // Go through all tabs and make sure their fragments match    // the correct state.    FragmentTransaction ft = null;    for (int i=0; i<mTabs.size(); i++) {        TabInfo tab = mTabs.get(i);        tab.fragment = mFragmentManager.findFragmentByTag(tab.tag);        if (tab.fragment != null && !tab.fragment.isDetached()) { if (tab.tag.equals(currentTab)) {     // The fragment for this tab is already there and     // active, and it is what we really want to have     // as the current tab.  Nothing to do.     mLastTab = tab; } else {     // This fragment was restored in the active state,     // but is not the current tab.  Deactivate it.     if (ft == null) {         ft = mFragmentManager.beginTransaction();     }     ft.detach(tab.fragment); }        }    }    // We are now ready to go.  Make sure we are switched to the    // correct tab.    mAttached = true;    ft = doTabChanged(currentTab, ft);    if (ft != null) {        ft.commit();        mFragmentManager.executePendingTransactions();    }}@Overrideprotected void onDetachedFromWindow() {    super.onDetachedFromWindow();    mAttached = false;}@Overrideprotected Parcelable onSaveInstanceState() {    Parcelable superState = super.onSaveInstanceState();    SavedState ss = new SavedState(superState);    ss.curTab = getCurrentTabTag();    return ss;}@Overrideprotected void onRestoreInstanceState(Parcelable state) {    SavedState ss = (SavedState)state;    super.onRestoreInstanceState(ss.getSuperState());    setCurrentTabByTag(ss.curTab);}@Overridepublic void onTabChanged(String tabId) {    if (mAttached) {        FragmentTransaction ft = doTabChanged(tabId, null);        if (ft != null) { ft.commit();        }    }    if (monTabChangeListener != null) {        mOnTabChangeListener.onTabChanged(tabId);    }}private FragmentTransaction doTabChanged(String tabId, FragmentTransaction ft) {    TabInfo newTab = null;    for (int i=0; i<mTabs.size(); i++) {        TabInfo tab = mTabs.get(i);        if (tab.tag.equals(tabId)) { newTab = tab;        }    }    if (newTab == null) {        throw new IllegalStateException("No tab known for tag " + tabId);    }    if (mLastTab != newTab) {        if (ft == null) { ft = mFragmentManager.beginTransaction();        }        if (mLastTab != null) { if (mLastTab.fragment != null) {     ft.detach(mLastTab.fragment); }        }        if (newTab != null) { if (newTab.fragment == null) {     newTab.fragment = Fragment.instantiate(mContext,  newTab.clss.getName(), newTab.args);     ft.add(mContainerId, newTab.fragment, newTab.tag); } else {     ft.attach(newTab.fragment); }        }        mLastTab = newTab;    }    return ft;}}


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/437994.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号