【问题标题】:How to replace a Fragment inside a single tab in ActionBar Tab如何在 ActionBar 选项卡的单个选项卡中替换片段
【发布时间】:2014-02-05 18:04:22
【问题描述】:

我在操作栏选项卡中有 3 个选项卡,每个选项卡中包含 3 个不同的片段。我想替换第一个标签中的片段。假设我们有 Fragment1 当前显示在 Tab1 中。假设 Fragment1 上有一个 Listview。当点击列表视图上的项目时,我想将 Fragment1 更改为 Fragment2。我怎么可能做到。请帮忙。下面是我的代码:

父活动代码:

public class ParentActivity extends FragmentActivity {

ActionBar actionBar;
private int mTitleRes;
protected Fragment mFrag;
private CharSequence mTitle;

// TESTING DATAS
private String report_options = "1110000000";
private ReportsTypeChecker reportChecker = new ReportsTypeChecker();

public static class TabListener<T extends Fragment> implements
        ActionBar.TabListener {
    private Fragment mFragment;
    private final FragmentActivity myActivity;
    private final String mTag;
    private final Class<T> mClass;

    /**
     * Constructor used each time a new tab is created.
     * 
     * @param activity
     *            The host Activity, used to instantiate the fragment
     * @param tag
     *            The identifier tag for the fragment
     * @param clz
     *            The fragment's Class, used to instantiate the fragment
     */
    public TabListener(FragmentActivity activity, String tag, Class<T> clz) {
        myActivity = activity;
        mTag = tag;
        mClass = clz;

    }

    @Override
    public void onTabReselected(Tab tab, FragmentTransaction ft) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onTabSelected(Tab tab, FragmentTransaction ft) {
        // TODO Auto-generated method stub

        System.out.println("ON tabs");
        if (mFragment == null) {
            System.out.println("mFragment null");
            // If not, instantiate and add it to the activity
            mFragment = Fragment.instantiate(myActivity, mClass.getName());
            ft.add(android.R.id.content, mFragment, mTag);

        } else {

            ft.show(mFragment);

        }

    }

    @Override
    public void onTabUnselected(Tab tab, FragmentTransaction ft) {
        // TODO Auto-generated method stub
        if (mFragment != null) {
            // Detach the fragment, because another one is being attached
            // ft.detach(mFragment);
            ft.hide(mFragment);
        }
    }

}

@Override
public void onCreate(Bundle savedInstanceState) {
    // getWindow().setUiOptions(
    // ActivityInfo.UIOPTION_SPLIT_ACTION_BAR_WHEN_NARROW);
    super.onCreate(savedInstanceState);
    // setContentView(R.layout.parent_layout);
    actionBar = getActionBar();
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

// HERE IS THE TAB1 THAT CONTAINS THE FRAGMENT1 THAT I WANT TO CHANGE INTO FRAGMENT2

                Tab tab = actionBar
                .newTab()
                .setText(getResources().getString(R.string.parent_tab1))
                .setTabListener(
                        new TabListener<Fragment1>(this,
                                getResources().getString(
                                        R.string.parent_tab1),
                                Fragment1.class));
        actionBar.addTab(tab);

    Tab tab2 = actionBar
            .newTab()
            .setText(getResources().getString(R.string.parent_tab2))
            .setTabListener(
                    new TabListener<AnnouncementsFragment>(this,
                            getResources().getString(R.string.parent_tab1),
                            AnnouncementsFragment.class));
    actionBar.addTab(tab2);

    Tab tab3 = actionBar
            .newTab()
            .setText(getResources().getString(R.string.parent_tab3))
            .setTabListener(
                    new TabListener<TodayFragment>(this, getResources()
                            .getString(R.string.parent_tab3),
                            TodayFragment.class));

    actionBar.addTab(tab3);

}}

这是我的 Fragment1:

public class Fragment1 extends Fragment {

ArrayList<String> storeList = new ArrayList<String>();
// String[] storeArray;
protected Fragment mFrag;
Button checkinbtn;
ListView storeLv;
ArrayAdapter<String> arrayAdapter;
String storetitle = "";

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    View myFragmentView = inflater.inflate(R.layout.fragment_usercheckin,
            container, false);

    // setTitle(getResources().getString(R.string.title_activity_report));

    storeLv = (ListView) myFragmentView.findViewById(R.id.checkin_lv);
    fillStores();

    arrayAdapter = new ArrayAdapter<String>(getActivity(),
            R.layout.listview_textitem, R.id.listview_txt, storeList);
    storeLv.setAdapter(arrayAdapter);

    storeLv.setOnItemClickListener(new OnItemClickListener() {
        public void onItemClick(AdapterView<?> myAdapter, View myView,
                int myItemInt, long mylng) {

// I want to Replace the current Fragment on the tab1 into Fragment2 here


        }
    });
    return myFragmentView;
}

}

希望你能帮帮我..谢谢

【问题讨论】:

    标签: android android-fragments android-actionbar android-tabs


    【解决方案1】:

    我认为您可以修改您的TabListener 并使用片段列表(或其类)。

    public static class TabListener<T extends Fragment> implements
            ActionBar.TabListener {
        private int mIndex;
        private ArrayList<Fragment> mFragments;
        private final FragmentActivity myActivity;
        private final String mTag;
        private final ArrayList<Class<T>> mClasses;
    
        /**
         * Constructor used each time a new tab is created.
         * 
         * @param activity
         *            The host Activity, used to instantiate the fragment
         * @param tag
         *            The identifier tag for the fragment
         * @param classes
         *            The fragment's Classes, used to instantiate the fragments
         */
        public TabListener(FragmentActivity activity, String tag, ArrayList<Class<T>> classes) {
            myActivity = activity;
            mTag = tag;
            mClasses = classes;
            mIndex = 0;
        }
    
        public boolean selectNextTab(Tab tab, FragmentTransaction ft) {
            if (mIndex < (mClasses.size() - 1)) {
                mIndex += 1;
                onTabSelected(Tab tab, FragmentTransaction ft);
                return true;
            } else {
                return false;
            }
        }
    
        public boolean selectPrevTab(Tab tab, FragmentTransaction ft) {
            if (mIndex > 0) {
                mIndex -= 1;
                onTabSelected(Tab tab, FragmentTransaction ft);
                return true;
            } else {
                return false;
            }
        }
    
        @Override
        public void onTabReselected(Tab tab, FragmentTransaction ft) {
            // TODO Auto-generated method stub
        }
    
        @Override
        public void onTabSelected(Tab tab, FragmentTransaction ft) {
            // TODO Auto-generated method stub
            System.out.println("ON tabs");
            if (mFragments.size() <= mIndex) {
                System.out.println("Fragment doesn't exist yet");
                // If not, instantiate and add it to the activity
                mFragments.add(Fragment.instantiate(myActivity, mClasses.get(mIndex).getName()));
                ft.add(android.R.id.content, mFragments.get(mIndex), mTag);
    
            } else {
                ft.show(mFragments.get(mIndex));
            }
        }
    
        @Override
        public void onTabUnselected(Tab tab, FragmentTransaction ft) {
            // TODO Auto-generated method stub
            if (mFragments.get(mIndex) != null) {
                // Detach the fragment, because another one is being attached
                // ft.detach(mFragment);
                ft.hide(mFragments.get(mIndex));
            }
        }
    }
    

    然后,您可以通过您的ParentActivity 访问特定的TabListener 实例,在您的onItemClick() 方法中调用selectNextTab() 方法。

    我不确定如何获取 TabFragmentTransaction 参数实例。第一次调用onTabSelected() 时,将实例放入TabListener 成员变量中可能就足够了。在这种情况下,您的 selectNextTab() 方法甚至不需要任何参数。

    另外,我认为它不适用于通用 T 定义。不过你应该可以使用Class&lt;Fragment&gt;

    如果它以这种方式工作,请告诉我。祝你好运。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-24
      • 1970-01-01
      • 2012-10-27
      相关资源
      最近更新 更多