Android: начать намерение в структуре кадра - PullRequest
3 голосов
/ 04 мая 2010

У меня есть основной вид деятельности с этим файлом макета:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_height="fill_parent"
  android:layout_width="fill_parent"
  android:orientation="vertical"
  android:id="@+id/container"
  >
    <LinearLayout
        android:layout_height="wrap_content"
        android:id="@+id/header" 
        android:background="@drawable/logo_bk"
        android:layout_width="fill_parent"
    >

    <Button 
        android:id="@+id/btn_reload"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Reload" 
     />

     <LinearLayout 
        android:id="@+id/LinearLayout01" 
        android:layout_width="fill_parent" 
        android:layout_height="fill_parent" 
        android:gravity="center_vertical|center_horizontal"
     >
        <ImageView 
            android:id="@+id/ImageView01" 
            android:src="@drawable/logo_head" 
            android:scaleType="fitStart" 
            android:adjustViewBounds="true" 
            android:layout_width="wrap_content" 
            android:layout_height="wrap_content" />
     </LinearLayout>

    </LinearLayout>

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

    <LinearLayout 
        android:layout_height="fill_parent" 
        android:layout_width="fill_parent" 
        android:gravity="center" 
        android:id="@+id/footer"
        android:layout_weight="2.6"
        android:background="#ffffff">
    </LinearLayout>

</LinearLayout>

В основном он состоит из заголовка, центральной части (android: id = "@ + id / center") и нижнего колонтитула. Нижний колонтитул содержит четыре динамически созданные кнопки. В конце он выглядит как TabWidget с вкладками внизу.

Кнопки каждого нижнего колонтитула содержат намерение / деятельность.

Вопрос: как я могу начать свою деятельность в FrameLayout? Например, TabHost делает это:

spec = tabHost
        .newTabSpec(tabTitle.toLowerCase())
        .setIndicator(tabTitle,res.getDrawable(R.drawable.tab_spec))
        .setContent(intent);
        tabHost.addTab(spec);

1 Ответ

6 голосов
/ 04 мая 2010

Если у вас есть отдельные действия для каждой страницы, которую вы хотите отобразить, вам нужно будет расширить ActivityGroup для действия контейнера (в котором отображаются вкладки) и LocalActivityManager для управления различными встроенными действиями, которые вы хотите использовать.

Это довольно сложно и не задокументировано. Я должен был прочитать исходный код для TabHost .

Поиск class IntentContentStrategy.

По сути, идея заключается в том, что у вас есть представление контейнера, и вы используете LocalActivityManager для загрузки действия, получения его представления и помещения его в представление контейнера.

Выдержка из TabHost.java:

    public View getContentView() {
        if (mLocalActivityManager == null) {
            throw new IllegalStateException("Did you forget to call 'public void setup(LocalActivityManager activityGroup)'?");
        }
        final Window w = mLocalActivityManager.startActivity(
                mTag, mIntent);
        final View wd = w != null ? w.getDecorView() : null;
        if (mLaunchedView != wd && mLaunchedView != null) {
            if (mLaunchedView.getParent() != null) {
                mTabContent.removeView(mLaunchedView);
            }
        }
        mLaunchedView = wd;

        // XXX Set FOCUS_AFTER_DESCENDANTS on embedded activities for now so they can get
        // focus if none of their children have it. They need focus to be able to
        // display menu items.
        //
        // Replace this with something better when Bug 628886 is fixed...
        //
        if (mLaunchedView != null) {
            mLaunchedView.setVisibility(View.VISIBLE);
            mLaunchedView.setFocusableInTouchMode(true);
            ((ViewGroup) mLaunchedView).setDescendantFocusability(
                    FOCUS_AFTER_DESCENDANTS);
        }
        return mLaunchedView;
    }

Примечание: есть много тонких и странных вещей, которые вы должны сделать, чтобы заставить это работать (обратите внимание на ошибку, на которую они ссылаются в комментарии), поэтому, вероятно, это не задокументировано.

...