Как отобразить один и тот же макет для двух разных вкладок в TabHost?

Я работаю над приложением для Android с действием, которое использует макет вкладок. Есть две вкладки, которые переключаются между содержимым, отображаемым в некоторых TextViews.

Это означает, что спецификации двух вкладок указывают на один и тот же макет (линейный) для контента, R.id.plantilla:

<?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="match_parent"
android:layout_height="match_parent" >

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

    <TabWidget
        android:id="@android:id/tabs"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <FrameLayout
        android:id="@android:id/tabcontent"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >

        <include layout="@layout/plantilla"/>


    </FrameLayout>
</LinearLayout>

But this only works if I switch to tab 2 and back to 1, i.e when the activity launches, the Layout "plantilla" can't be seen before tabs are changed. This is my problem.

Какой самый простой способ обойти это?

ПД: я пытался продублировать строку

<include layout="@layout/plantilla">

в tabhost xml, но в этом случае я не могу получить доступ к объектам TextViews из кода Java, используя findViewById(R.id.someTextView);


person cs4r    schedule 24.03.2012    source источник


Ответы (2)


Я не верю, что вы можете использовать include, я думаю, вам нужно дважды определить свой макет в xml с разными тегами id.

Или вы можете просто определить представление контейнера, а затем программно добавить к нему представления. Я делал это раньше. Вот как я это сделал:

макет таблицы

<?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" >
    <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:orientation="vertical"
            android:padding="5dp" >
            <TextView
                    android:id="@+id/setupheader"
                    android:layout_width="fill_parent"
                    android:layout_height="20dp"
                    android:textSize="15dp" />
            <TabWidget
                    android:id="@android:id/tabs"
                    android:layout_width="fill_parent"
                    android:layout_height="30dp"
                    android:gravity="bottom" />
            <FrameLayout
                    android:id="@android:id/tabcontent"
                    android:layout_width="fill_parent"
                    android:layout_height="fill_parent"
                    android:padding="5dp" >
                    <!-- General Info Tab -->
                    <LinearLayout
                            android:id="@+id/general_tab"
                            android:layout_width="fill_parent"
                            android:layout_height="wrap_content"
                            android:orientation="vertical" >
                    </LinearLayout>
                    <!-- Tool Tab -->
                    <LinearLayout
                            android:id="@+id/tool_tab"
                            android:layout_width="fill_parent"
                            android:layout_height="wrap_content"
                            android:orientation="vertical" >
                            <ListView
                                    android:id="@+id/list1"
                                    android:layout_width="match_parent"
                                    android:layout_height="0dp"
                                    android:layout_weight="1"
                                    android:drawSelectorOnTop="false" />
                    </LinearLayout>
                    <!-- Offset Tab -->
                    <LinearLayout
                            android:id="@+id/offset_tab"
                            android:layout_width="fill_parent"
                            android:layout_height="wrap_content"
                            android:orientation="vertical" >
                            <ListView
                                    android:id="@+id/list2"
                                    android:layout_width="match_parent"
                                    android:layout_height="0dp"
                                    android:layout_weight="1"
                                    android:drawSelectorOnTop="false" />
                    </LinearLayout>
                    <!-- Notes Tab -->
                    <LinearLayout
                            android:id="@+id/note_tab"
                            android:layout_width="fill_parent"
                            android:layout_height="fill_parent"
                            android:orientation="vertical" >
                    </LinearLayout>
            </FrameLayout>
    </LinearLayout>
</TabHost>

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

активность вкладок

public class SetupDisplay extends TabActivity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.setupdetailmain);

            Bundle extras = getIntent().getExtras();
            RowId = extras.getLong("RowId");
            StartTab = extras.getInt("StartTab");

            // ***************************************************************
            // Set up the tabs in the tabhost
            // ***************************************************************
            tabHost = getTabHost();
            TabHost.TabSpec spec;
            spec = tabHost.newTabSpec("General").setIndicator("General")
                            .setContent(R.id.general_tab);
            tabHost.addTab(spec);
            spec = tabHost.newTabSpec("Tools").setIndicator("Tools")
                            .setContent(R.id.tool_tab);
            tabHost.addTab(spec);
            spec = tabHost.newTabSpec("Offsets").setIndicator("Offsets")
                            .setContent(R.id.offset_tab);
            tabHost.addTab(spec);
            spec = tabHost.newTabSpec("Notes").setIndicator("Notes")
                            .setContent(R.id.note_tab);
            tabHost.addTab(spec);
            populateTabs(StartTab);
    }

    // ***************************************************************
    // Clear views from linear layout tabs
    // ***************************************************************
    private void clearTabs() {
            general.removeAllViews();
            notes.removeAllViews();
    }

    // ***************************************************************
    // Fill the tabs
    // ***************************************************************
    private void populateTabs(int TabShown) {

            generaltab();
            tooltab();
            notestab();
            offsettab();

            tabHost.setCurrentTab(TabShown);
    }

    // ***************************************************************
    // Fill the General tab
    // ***************************************************************
    private void generaltab() {
        general = (LinearLayout) findViewById(R.id.general_tab);
        String prgdisp = SETUPINFO_PGM1;
        if (SETUPINFO_PGM2 != null) {
            prgdisp = prgdisp + ", " + SETUPINFO_PGM2;
        }
        if (SETUPINFO_PGM3 != null) {
            prgdisp = prgdisp + ", " + SETUPINFO_PGM3;
        }
        TextView programs = new TextView(this);
        programs.setText("Program(s): " + prgdisp);
        programs.setTextSize(20);
        general.addView(programs);

        if (SETUPINFO_KIT == null || SETUPINFO_KIT.equals("No Kit")) {
        } else {
            TextView kit = new TextView(this);
            kit.setText("Kit: " + SETUPINFO_KIT);
            kit.setTextSize(20);
            general.addView(kit);
        }

        if (SETUPINFO_FIXTURE1 == null && SETUPINFO_FIXTURE2 == null) {
        } else {
            String fixtdisp = SETUPINFO_FIXTURE1;
            if (SETUPINFO_FIXTURE2 != null) {
                fixtdisp = fixtdisp + ", " + SETUPINFO_FIXTURE2;
            }
            TextView fixtures = new TextView(this);
            fixtures.setText("Fixture(s): " + fixtdisp);
            fixtures.setTextSize(20);
            general.addView(fixtures);
            TextView fixtureloc = new TextView(this);
            fixtureloc.setText("Fixture Location: " + SETUPINFO_FIXTURELOC);
            fixtureloc.setTextSize(20);
            general.addView(fixtureloc);
        }

        if (SETUPINFO_VISE == null) {
        } else {
            TextView vise = new TextView(this);
            vise.setText("Vise(s): " + SETUPINFO_VISE);
            vise.setTextSize(20);
            general.addView(vise);
        }
    }

    // ***************************************************************
    // Fill the Offset tab
    // ***************************************************************
    private void offsettab() {
            wpccount = 0;
            for (int i = 0; i < 20; i++) {
                    if (wpcdesc[i] != null) {
                            wpcdisplayhold[wpccount] = wpcid[i] + " - " + wpcdesc[i];
                            wpcidhold[wpccount] = wpcid[i];
                            wpcdeschold[wpccount] = wpcdesc[i];
                            wpccount++;
                    }
            }
            wpcdisplay = new String[wpccount];
            for (int i = 0; i < wpccount; i++) {
                    wpcdisplay[i] = wpcdisplayhold[i];
            }
            mWPCView = (ListView) findViewById(R.id.list2);
            mWPCView.setAdapter(new ColorizingListAdapter(SetupDisplay.this,
                            wpcdisplay, "Offset"));
            registerForContextMenu(mWPCView);
    }

    // ***************************************************************
    // Fill the Notes tab
    // ***************************************************************
    private void notestab() {
            notes = (LinearLayout) findViewById(R.id.note_tab);
            notestxt = new TextView(this);
            notestxt.setText(SETUPINFO_NOTES);
            notestxt.setTextSize(15);
            notes.addView(notestxt);
    }

}

Надеюсь это поможет.

person Barak    schedule 24.03.2012

Пожалуйста, удалите тег include из макета xml и оставьте что-то простое:

<?xml version="1.0" encoding="utf-8"?>
<!-- Tab Host -->
<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">

    <!-- Bottom tab bar -->
    <LinearLayout
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:padding="5dp">

        <FrameLayout
            android:id="@android:id/tabcontent"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:padding="5dp"
            android:layout_weight="1"/>

        <!-- -5dip bottom margin for not showing the annoying bottom line -->
        <TabWidget
            android:id="@android:id/tabs"
            android:layout_width="fill_parent"
            android:layout_height="65dip"
            android:layout_weight="0"
            android:layout_marginBottom="-5dip"/>

    </LinearLayout>

</TabHost>

И из вашего класса TabActivity просто поместите это в onCreate():

            //Set tab host
        tabHost = getTabHost();

        //First Tab
        TabSpec firstTabSpec = tabHost.newTabSpec("FirstTab");//title
        firstTabSpec.setIndicator("FirstTab", getResources().getDrawable(R.drawable.item_first_tab)); //icon
        Intent firstTabIntent = new Intent(this, FirstTab.class);//action
        firstTabSpec.setContent(firstTabIntent);//set tab

        //Second Tab
        TabSpec secondTabSpec = tabHost.newTabSpec("SecondTab");//title
        secondTabSpec.setIndicator("SecondTab", getResources().getDrawable(R.drawable.second_tab));//icon
        Intent secondTabIntent = new Intent(this, FirstTab.class);//action
        secondTabSpec.setContent(secondTabIntent);//set tab

        //Add tabs to tab host
        tabHost.addTab(firstTabSpec);//add first tab
        tabHost.addTab(secondTabSpec);//add second tab which goes to your FirstTab.class

Вы можете создавать разные действия для вкладок или использовать одно.

person Radu Dan    schedule 24.03.2012
comment
Спасибо друг, но этот метод мне не помогает, потому что я не хочу иметь активность по вкладке. Мне нужно одно действие, TabActivity, которое в зависимости от отмеченной вкладки отображает различный контент. Содержимое, отображаемое на каждой из вкладок, считывается из частного объекта, имеющего свойство TabActivity. Если у меня есть более одного действия, я должен разделить этот объект между действиями, которые я считаю более сложными, чем иметь одинаковую компоновку для двух вкладок. - person cs4r; 24.03.2012