Вкладки с использованием фрагментов на Android, но внутри другого макета - PullRequest
0 голосов
/ 01 ноября 2011

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

Мой основной код:

package my.android;

import android.os.Bundle;

public class MyActivity extends FragmentActivity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }
}

У меня есть разные файлы макетов для всех вкладок, и у меня есть класс TabsActivity, который я создал, следуя инструкциям здесь: http://thepseudocoder.wordpress.com/2011/10/04/android-tabs-the-fragment-way/

Итак, как мне добавить объект TabsActivity ta в MyActivity? И важно быть ниже содержания этого. Заранее спасибо ...

1 Ответ

0 голосов
/ 01 ноября 2011

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

Вот как вы запускаете действия и получаете их виды:

final Window w = getLocalActivityManager().startActivity(myTag, myIntent);
final View wd = w != null ? w.getDecorView() : null;
if (  null != wd ) {
    wd.setVisibility(View.VISIBLE);
    wd.setFocusableInTouchMode(true);
}
// TODO: Attach wd to a ViewGroup.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Редактировать: Ниже приведено более полное решение.

Это макет для действия верхнего уровня:

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

Вот класс верхнего уровня:

public class EmbeddedActivityParent extends ActivityGroup {

    private LinearLayout    mRootLayout;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.main);

         mRootLayout = (LinearLayout) findViewById(R.id.root_layout);

         // Add embedded status activity.
         embedActivity("StatusColumn", new Intent(this, StatusActivity.class));

         // Add embedded work activity.
         embedActivity("WorkArea", new Intent(this, MainActivity.class));
    }

    private void embedActivity(String myTag, Intent launchIntent) {
         final Window w = getLocalActivityManager().startActivity(myTag, launchIntent);
         final View wd = w != null ? w.getDecorView() : null;
         if (  null != wd ) {
             wd.setVisibility(View.VISIBLE);
             wd.setFocusableInTouchMode(true);

             mRootLayout.addView(wd);
         }
    }
}

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

Лично я думаю, что для ActivityGroup все еще есть применение, и надеюсь, что Gooogle решит отказаться от него.

...