【问题标题】:Dynamically changing the fragments inside a fragment tab host?动态更改片段选项卡主机内的片段?
【发布时间】:2013-08-08 07:40:56
【问题描述】:

我有一个主要活动,这里是片段活动我正在设置两个选项卡,在 B 片段中包含两个片段 A 和 B 当用户单击按钮时我有一个按钮我想将片段 B 更改为片段 C。但是上面的标签是可见的...

如何实现标签内的片段替换?

非常感谢任何解决方案。

【问题讨论】:

    标签: android android-fragments android-tabhost fragment-tab-host android-nested-fragment


    【解决方案1】:

    基本概念——我们可以通过创建一个容器来实现这一点。每个选项卡都将分配一个特定的容器。现在,当我们需要一个新片段时,我们将使用这个容器替换相同的片段。

    请按照下面提到的代码一步一步来更好地理解。 第 1 步:为您的应用创建选项卡。说“Home.java”。它将包含使用片段创建选项卡的代码。

        import android.os.Bundle;
        import android.support.v4.app.FragmentActivity;
        import android.support.v4.app.FragmentTabHost;
        import android.widget.TextView;
        import app.drugs.talksooner.container.GoContainerFragment;
        import app.drugs.talksooner.container.LearnContainerFragment;
        import app.drugs.talksooner.container.MoreContainerFragment;
        import app.drugs.talksooner.container.TalkContainerFragment;
        import app.drugs.talksooner.container.WatchContainerFragment;
        import app.drugs.talksooner.utils.BaseContainerFragment;
    
        public class Home extends FragmentActivity {
    
            private static final String TAB_1_TAG = "tab_1";
            private static final String TAB_2_TAG = "tab_2";
            private static final String TAB_3_TAG = "tab_3";
            private static final String TAB_4_TAG = "tab_4";
            private static final String TAB_5_TAG = "tab_5";
            private FragmentTabHost mTabHost;
    
            @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.home);
                initView();
            }
    
            private void initView() {
                mTabHost = (FragmentTabHost)findViewById(android.R.id.tabhost);
                mTabHost.setup(this, getSupportFragmentManager(), R.id.realtabcontent);
    
               // mTabHost.addTab(mTabHost.newTabSpec(TAB_1_TAG).setIndicator("Talk", getResources().getDrawable(R.drawable.ic_launcher)), TalkContainerFragment.class, null);
                mTabHost.addTab(mTabHost.newTabSpec(TAB_1_TAG).setIndicator("Talk"), TalkContainerFragment.class, null);
                mTabHost.addTab(mTabHost.newTabSpec(TAB_2_TAG).setIndicator("Learn"), LearnContainerFragment.class, null);
                mTabHost.addTab(mTabHost.newTabSpec(TAB_3_TAG).setIndicator("Go"), GoContainerFragment.class, null);
                mTabHost.addTab(mTabHost.newTabSpec(TAB_4_TAG).setIndicator("Watch"), WatchContainerFragment.class, null);
                mTabHost.addTab(mTabHost.newTabSpec(TAB_5_TAG).setIndicator("More"), MoreContainerFragment.class, null);
    
                /* Increase tab height programatically 
                 * tabs.getTabWidget().getChildAt(1).getLayoutParams().height = 150; 
                 */
    
                for (int i = 0; i < mTabHost.getTabWidget().getChildCount(); i++) {
                    final TextView tv = (TextView) mTabHost.getTabWidget().getChildAt(i).findViewById(android.R.id.title);
                    if (tv == null)
                    continue;
                    else
                    tv.setTextSize(10);
    
                }
    
            }
    
            @Override
            public void onBackPressed() {
                boolean isPopFragment = false;
                String currentTabTag = mTabHost.getCurrentTabTag();
                if (currentTabTag.equals(TAB_1_TAG)) {
                    isPopFragment = ((BaseContainerFragment)getSupportFragmentManager().findFragmentByTag(TAB_1_TAG)).popFragment();
                } else if (currentTabTag.equals(TAB_2_TAG)) {
                    isPopFragment = ((BaseContainerFragment)getSupportFragmentManager().findFragmentByTag(TAB_2_TAG)).popFragment();
                } else if (currentTabTag.equals(TAB_3_TAG)) {
                    isPopFragment = ((BaseContainerFragment)getSupportFragmentManager().findFragmentByTag(TAB_3_TAG)).popFragment();
                } else if (currentTabTag.equals(TAB_4_TAG)) {
                    isPopFragment = ((BaseContainerFragment)getSupportFragmentManager().findFragmentByTag(TAB_4_TAG)).popFragment();
                } else if (currentTabTag.equals(TAB_5_TAG)) {
                    isPopFragment = ((BaseContainerFragment)getSupportFragmentManager().findFragmentByTag(TAB_5_TAG)).popFragment();
                }
                if (!isPopFragment) {
                    finish();
                }
            }
    
    
        }
    

    您的 home.xml 文件

        <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical" >
    
             <FrameLayout
                android:id="@+id/realtabcontent"
                android:layout_width="match_parent"
                android:layout_height="0dip"
                android:layout_weight="1" />
    
    
            <android.support.v4.app.FragmentTabHost
                android:id="@android:id/tabhost"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                >
    
                <FrameLayout
                    android:id="@android:id/tabcontent"
                    android:layout_width="0dip"
                    android:layout_height="0dip"
                    android:layout_weight="0" />
    
            </android.support.v4.app.FragmentTabHost>
    
        </LinearLayout>
    

    步骤 2:定义基本容器片段,这将有助于片段的回溯和替换“检查 replaceFragement()”。我们的类“BaseContainerFragment.java”

        import android.support.v4.app.Fragment;
        import android.support.v4.app.FragmentTransaction;
        import android.util.Log;
        import app.drugs.talksooner.R;
    
        public class BaseContainerFragment extends Fragment {
    
            public void replaceFragment(Fragment fragment, boolean addToBackStack) {
                FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
                if (addToBackStack) {
                    transaction.addToBackStack(null);
                }
                transaction.replace(R.id.container_framelayout, fragment);
                transaction.commit();
                getChildFragmentManager().executePendingTransactions();
            }
    
            public boolean popFragment() {
                Log.e("test", "pop fragment: " + getChildFragmentManager().getBackStackEntryCount());
                boolean isPop = false;
                if (getChildFragmentManager().getBackStackEntryCount() > 0) {
                    isPop = true;
                    getChildFragmentManager().popBackStack();
                }
                return isPop;
            }
    
        }
    

    Step3:现在我在这里考虑一个片段,只希望你能以同样的方式处理其余部分。定义容器片段类。每个选项卡都有特定的容器。为第一个选项卡说 TalkContainerFragment.java

        import android.os.Bundle;
        import android.util.Log;
        import android.view.LayoutInflater;
        import android.view.View;
        import android.view.ViewGroup;
        import app.drugs.talksooner.R;
        import app.drugs.talksooner.Talk;
        import app.drugs.talksooner.utils.BaseContainerFragment;
    
        public class TalkContainerFragment extends BaseContainerFragment {
    
            private boolean mIsViewInited;
    
            @Override
            public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
                Log.e("test", "tab 1 oncreateview");
                return inflater.inflate(R.layout.container_fragment, null);
            }
    
            @Override
            public void onActivityCreated(Bundle savedInstanceState) {
                super.onActivityCreated(savedInstanceState);
                Log.e("test", "tab 1 container on activity created");
                if (!mIsViewInited) {
                    mIsViewInited = true;
                    initView();
                }
            }
    
            private void initView() {
                Log.e("test", "tab 1 init view");
                replaceFragment(new Talk(), false);
            }
    
        }
    

    它是 xml 文件。 “container_fragment.xml” 这个 xml 容器包含 frameLayout。我们将使用这个 id 来替换不同的 Fragment。

        <?xml version="1.0" encoding="utf-8"?>
        <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:id="@+id/container_framelayout"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
    
    
        </FrameLayout>
    

    你的主要课程。 “Talk.java”

        public class Talk extends Fragment {
    
            /** Define global variables over here */
            //private ProgressDialog pDialog;
            StaticApiList sal;
            TalkModelAll tma;
            JSONObject myJasonObject = null;
            private ListView lv;
            private ArrayList<TalkModelAll> m_ArrayList = null;
            //ArrayList<String> stringArrayList = new ArrayList<String>();
            TalkArrayAdapter taa;
            Set<String> uniqueValues = new HashSet<String>();
            TextView rowTextView = null;
            boolean vivek = false;
    
            int postid;
            String title;
            String thumsrc;
            String largeimg;
            String excert;
            String description;
            String cat;
            String myUrl;
            String jsonString;
            int mCurCheckPosition;
            String check_state = null;
            String ccc;
            LinearLayout myLinearLayout;
    
            @Override
            public View onCreateView(LayoutInflater inflater, ViewGroup container,
                    Bundle savedInstanceState) {
    
                View rootView = inflater.inflate(R.layout.talk, container, false);
    
                Button btn = (Button) rootView.findViewById(R.id.your_btn_id);
                btn.setOnClickListener(new OnClickListener() {
    
                    @Override
                    public void onClick(View v) {
                        // TODO Auto-generated method stub
    //Here TalkDetail is name of class that needs to open
                        TalkDetail fragment = new TalkDetail();
                        // if U need to pass some data 
                        Bundle bundle = new Bundle();
    
                        bundle.putString("title", m_ArrayList.get(arg2).title);
                        bundle.putString("largeimg", m_ArrayList.get(arg2).largeimg);
                        bundle.putString("excert", m_ArrayList.get(arg2).excert);
                        bundle.putString("description", m_ArrayList.get(arg2).description);
                        bundle.putString("cat", m_ArrayList.get(arg2).cat);
                        //bundle.putInt("postid", m_ArrayList.get(arg2).postid);
    
                        fragment.setArguments(bundle);
                        ((BaseContainerFragment)getParentFragment()).replaceFragment(fragment, true);
                    }
                });
    
                return rootView;
            }
        }
    

    就是这样。你已准备好出发。整个魔力在于调用 R.id。而不是 R.layout。 干杯!

    【讨论】:

    • 干得好..你真的是个黑客..这就是我要找的。感谢 +1。
    • 它在没有地图的情况下工作正常.. 但是如何在这里使用地图.. 如果我使用 BaseContainer 片段,它会给我 nullPointerException。按钮的 onClick 将其重定向到我需要显示地图的片段。请帮助我
    • @user2199280 .. 您只需要在布局中定义地图片段。 :) .. 也不要忘记在清单文件中包含谷歌密钥和其他凭据。
    • 哇,这救了我的工作!谢谢,AndroidHacker!
    • 很好的答案。你是天才!!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-15
    • 2012-04-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多