Android, как взаимодействовать с вкладками фрагмента - PullRequest
3 голосов
/ 09 ноября 2011

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

http://i40.tinypic.com/22bwxx.png

так что структура этого представляет собой простое действие с именем Main, которое просто устанавливает представление содержимого для maintabholder.xml документа, который содержит представление фрагмента, которое подключается к классу с именем MainNav, представление содержимого которого содержит все вкладки в дно.

maintabholder.xml:

<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
>

<include layout="@layout/header" android:layout_alignParentTop="true"           android:id="@+id/headerArea"></include>
<fragment
    class="my.package.name.MainNav"
    android:id="@+id/fragment_tabs"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" />
</LinearLayout>

MainNav.java code snippet:

  @Override
  public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) 
{
    mRoot = inflater.inflate(R.layout.fragment_tabs, null);
    mTabHost = (TabHost) mRoot.findViewById(android.R.id.tabhost);
    setupTabs();
    return mRoot;
}

и R.layout.fragment_tabs:

<?xml version="1.0" encoding="utf-8"?>
<TabHost
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/tabhost"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#EFEFEF">

<RelativeLayout
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

    <TabWidget
        android:id="@android:id/tabs"
        android:layout_alignParentBottom="true"
        android:layout_width="fill_parent"
        android:background="@drawable/tab_background"
        android:gravity="center_horizontal"
        android:layout_height="wrap_content" >
    </TabWidget>

        <FrameLayout
            android:id="@android:id/tabcontent"
            android:layout_width="fill_parent"

            android:layout_height="wrap_content">

            <FrameLayout
                android:id="@+id/tab_1"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" />

            <FrameLayout
                android:id="@+id/tab_2"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" />
             <FrameLayout
                android:id="@+id/tab_3"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" />
              <FrameLayout
                android:id="@+id/tab_4"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" />
               <FrameLayout
                android:id="@+id/tab_5"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" />

        </FrameLayout>
</RelativeLayout>

и, наконец, содержимое действия, которое я хочу загрузить во фрагмент (после нажатия кнопки tab1)

 public class HomeFragment extends Activity {


@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.home);

    }
 }

Это поможет вам понять суть вещей, но проблема возникает здесь, в MainNav.java:

.
  @Override
   public void onTabChanged(String tabId) {
        Log.d(TAG, "onTabChanged(): tabId=" + tabId);
        if (TAB_HOME.equals(tabId)) {
            updateTab(tabId, R.id.tab_1);
            mCurrentTab = 0;
            return;
        }
   }

при нажатии на вкладку она регистрируется в действии onTabChanged и вызывается функция updateTab:

   private void updateTab(String tabId, int placeholder) {
        FragmentManager fm = getFragmentManager();
        if (fm.findFragmentByTag(tabId) == null) {
            //fm.beginTransaction()
             //      .replace(placeholder, /*need fragment object here*/ , tabId)
             //       .commit();
            //
        }
}

закомментированный replace метод ищет (int, fragment, string), и я полагаю, что он должен изменить пробел для меня.

но я не понимаю, откуда взять фрагмент объекта! Этот фантомный объект должен как-то содержать xml-макет моего HomeFragment и позволять мне взаимодействовать со всем остальным, что я кодировал для действия HomeFragment.

Моя первая догадка, что моя HomeFragment активность должна вместо extend FragmentActivity просто активность. Но это где я бью стену.

Существует очень мало документации по методам пакета совместимости, но в документации для TabActivity сказано, что больше не следует использовать TabActivity, поэтому я здесь. Разработка для Android 2.2 +

Проницательность приветствуется.

1 Ответ

5 голосов
/ 09 ноября 2011

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

Итак, вот два правила:

  1. Вы не можете поместить Действия в Фрагменты.
  2. Вы не можете помещать фрагменты в фрагменты.

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

Вот макет (maintabholder.xml):

<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
>

<include layout="@layout/header" android:layout_alignParentTop="true"           android:id="@+id/headerArea"></include>

<FrameLayout android:id="@+id/TabContent"
    android:layout_width="fill_parent"
    android:layout_height="0dip"
    android:layout_weight="1"/>

<fragment
    class="my.package.name.MainNav"
    android:id="@+id/fragment_tabs"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content" />
</LinearLayout>

Когда в нижнем фрагменте происходит переключение табуляции, вы сообщаете об этом родительскому действию:

...
(YourActivity)getActivity().switchToTab(tabId);
...

А в YourActivity:

...
public void switchToTab(int tabId){
    switch(tabId){
    ...
    case 2:
        getSupportFragmentManager().beginTransaction().replace(R.id.TabContent, TabContentFragment2.newInstance(), "someTag").commit().
    break;
    ...
    }
}

Нечто подобное.

...