Изменение представления контента действий на основе вкладок панели действий - PullRequest
1 голос
/ 01 декабря 2011

Мне интересно, можно ли это сделать?В основном у меня есть макет с двумя фрагментами, который я использую для большинства своих вкладок, но на двух вкладках я хочу добавить еще пару фрагментов, чтобы отобразить больше вещей.Можно ли изменить представление содержимого на другой макет при смене вкладок?

Если это невозможно, я подумал о создании макета со всеми фрагментами фрагментов, которые мне понадобятся, и просто измените макеты фрагментов.так что те, которые я не использую, не "показывают".Я не имею в виду использование FragmentTransaction.hide(), потому что я хочу, чтобы фрагменты заполняли экран, когда другие не используются.Будет ли это плохой идеей или есть более простой способ сделать то, что я хочу?

вот мой код для активности и вкладок

public class Tabs extends Activity{
long deleteID;

@Override
public void onCreate(Bundle create){
    super.onCreate(create);

    setContentView(R.layout.main_layout);

    createTabs();
    ActionBar bar = getActionBar();
    bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
    bar.setDisplayOptions(0, ActionBar.DISPLAY_SHOW_TITLE);
    bar.setDisplayHomeAsUpEnabled(true);

    if(create != null){
        bar.setSelectedNavigationItem(create.getInt("Home",0));
    }

}

Я также добавляю вкладки и еще много чего.не важно

это подкласс actionbar

private class TabListener implements ActionBar.TabListener{
    TabContent mFragment;

    public TabListener(TabContent fragment) {
        mFragment = fragment;
    }

    @Override
    public void onTabReselected(Tab tab, android.app.FragmentTransaction ft) {

    }

    @Override
    public void onTabSelected(Tab tab, android.app.FragmentTransaction ft) {

            ListFragment newListFragment = new BowlersListFragment();
            Fragment newFragment = new BowlerEntryFrag();
            ft = getFragmentManager().beginTransaction();
            ft.replace(R.id.frameOne, newListFragment);
            ft.replace(R.id.frameTwo, newFragment);

        ft.addToBackStack(null);
        ft.commit();
    }

    @Override
    public void onTabUnselected(Tab tab, android.app.FragmentTransaction ft) {

        if(ft != null){
            ft.remove(mFragment);
        }
    }

}

}

Я пытался сделать Activity.setContentView(r.layout.newView), но это не сработает

1 Ответ

1 голос
/ 02 апреля 2012

У меня была похожая проблема, поэтому реализовал ее так.У меня есть mainActivity, которая содержит и создает вкладки.В этом упражнении используется макет с одним контейнером фрагмента, main.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_gravity="center"
android:orientation="vertical" >

<LinearLayout
    android:id="@+id/fragment_container"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

</RelativeLayout>

В моей работе у меня есть следующий код для создания вкладок и фрагментов:

historyTab = actionbar.newTab().setText("History");
historyTab.setTabListener(new MyTabsListener(new HistoryFragment()));
actionbar.addTab(historyTab);

Мой tabListener выглядитчто-то вроде этого:

    private class MyTabsListener implements ActionBar.TabListener {
    public Fragment fragment;
    private boolean isFragmentAdded = false;

    public MyTabsListener(Fragment fragment) {
        this.fragment = fragment;
    }
           @Override
    public void onTabSelected(Tab tab, android.app.FragmentTransaction ft) {

        FragmentManager fragMgr = getSupportFragmentManager();
        FragmentTransaction xaction = fragMgr.beginTransaction();

        if (fragment instanceof HistoryFragment) {
            fragment = new HistoryFragment();
            xaction.add(R.id.fragment_container, fragment);
        } else if (fragment instanceof .. some other fragment..) {
            fragment = new .. some other fragment();
            xaction.add(R.id.fragment_container, fragment);
        } 
        }

        xaction.commit();
    }

    @Override
    public void onTabUnselected(Tab tab, android.app.FragmentTransaction ft) {

        FragmentManager fragMgr = getSupportFragmentManager();
        FragmentTransaction xaction;

        xaction = fragMgr.beginTransaction();
        Fragment fragment = fragMgr.findFragmentById(R.id.fragment_container);
        xaction.remove(fragment);

        xaction.commit();
    }

}

Макет для фрагмента истории в моем примере может быть любым, даже макетом, который содержит два фрагмента или столько, сколько вам нужно.Просто будьте осторожны, и в методе onCreateview во фрагменте используйте это:

    @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle          
savedInstanceState) {
    if (view == null) { // this line is very important!
        view = inflater.inflate(R.layout.history_fragment_layout, container, false);
        listView = (ListView) view.findViewById(R.id.historyList);
    }

    return view;
}

Надеюсь, это поможет! :)) 1013 *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...