Android - 如何使用现有布局按需创建标签?

时间:2013-03-09 15:43:05

标签: android tabs android-tabhost

强制性背景信息:我正在建造一个平板电脑应用,供房地产经纪人在引用住宅和建筑物时使用。由于家庭或公寓可以拥有任意数量的房间,我认为建立一个基于标签的解决方案会很好,这个解决方案可以按房间进行,并按需为每个房间创建一个标签。

我已经浏览了几个标签教程,但我发现的所有解决方案都处理了预定义数量的标签,并使用了已弃用的TabHost。

TabHost.TabSpec ourSpec = tabhost.newTabSpec("tag1");
ourSpec.setContent(new TabHost.TabContentFactory()
{

    @Override
    public View createTabContent(String tag)
    {
        // Put some GUI stuff here
        return null;
    }
});

问题:我想重新使用新标签的现有布局,并以某种方式记录到目前为止已创建的标签数量。

2 个答案:

答案 0 :(得分:1)

为此我使用了以下代码

TabSpec fifthTabSpec = tabHost.newTabSpec("tid5");
addTab(fifthTabSpec , "",
        getResources().getDrawable(R.drawable.icon), new Intent(
                A.this, B.class));

这是addTab方法

private void addTab(TabSpec spec, String labelId, Drawable drawable,
            Intent intent) {

        View tabIndicator = LayoutInflater.from(this).inflate(
                R.layout.tab_indicator, getTabWidget(), false); // tab_indicator is a layout for the tab widget as i used custom icon and style

        ImageView icon = (ImageView) tabIndicator.findViewById(R.id.icon);
        icon.setImageDrawable(drawable);
        icon.setScaleType(ImageView.ScaleType.FIT_CENTER);

        spec.setIndicator(tabIndicator);
        spec.setContent(intent);
        tabHost.addTab(spec);
    }

这是tab_indicator

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="0dip"
android:layout_height="55dip"
android:layout_weight="1"
android:orientation="vertical"
android:weightSum="55" >

<ImageView
    android:id="@+id/icon"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_weight="30"
    android:adjustViewBounds="false"
    android:padding="10dp"
    android:background="@drawable/tab_icon_selector"  // tab_icon_selector is custom selector
    android:src="@drawable/icon" />

希望你能找到这个有用的

答案 1 :(得分:0)

经过大量的研究,终于设法将可行的东西放在一起。

Sankar Ganesh的tutorial非常有用。

MainActivity.java:

package com.example.workingdynamictabexample;

import android.app.TabActivity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.TabHost;

@SuppressWarnings("deprecation")
public class MainActivity extends TabActivity
{
    private TabHost tabHost;

    private int z = 0;

    private static final int
        ADD_TAB = Menu.FIRST + 11,
        DELETE_TAB = Menu.FIRST + 12;

    private String Test = null;

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

        this.tabHost = getTabHost();

        Intent newRoom = new Intent();

        newRoom.setClass(this, RoomActivity.class);

        Test = Intent.CATEGORY_LAUNCHER;

        Log.d("Test", Test);

        tabHost.addTab(
                tabHost.newTabSpec("Main")
                        .setIndicator("New room")
                        .setContent(newRoom)
                        );
    }

    private void addTab()
    {
        Intent newRoom = new Intent();

        newRoom.setClass(this, RoomActivity.class);

        tabHost.addTab(
                tabHost.newTabSpec("NewRoomTab")
                        .setIndicator("New room")
                        .setContent(newRoom)
                );

        Log.d("z", Integer.toString(z));

        ++z;
    }

    // "Boss, we really cannot delete one a'dem tab gubbinz, so we hides 'em."
    private void deleteTab() 
    {
        int position = tabHost.getCurrentTab();
        Log.d("Position", Integer.toString(position));

        Log.d("Z val in delete()", Integer.toString(z));

        tabHost.getCurrentTabView().setVisibility(View.GONE);

        if (position > 0)
        {
            tabHost.setCurrentTab(position + 1);

            z -= 1;

            if (z < 0)
            {
                z = 0;
            }
        }
        else if (position == 0)
        {
            tabHost.setCurrentTab(position + 1);

            z = 0;
        }
        else if (position == z)
        {
            tabHost.setCurrentTab(z - 1);

            Log.d("Z value in final", "lol");
            Log.d("Pos", Integer.toString(position));
            Log.d("Z pos", Integer.toString(z));
        }       
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) 
    {
        menu.add(Menu.NONE, ADD_TAB, Menu.NONE, "New room")
            .setAlphabeticShortcut('a');

        return (super.onCreateOptionsMenu(menu));
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item)
    {
        switch (item.getItemId())
        {
        case ADD_TAB:
            addTab();

            return (true);

        case DELETE_TAB:
            deleteTab();

            return (true);
        }

        return (super.onOptionsItemSelected(item));
    }
}

RoomActivity.java:

package com.example.workingdynamictabexample;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;

public class RoomActivity extends Activity
{
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.tabhost);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) 
    {
        return (super.onCreateOptionsMenu(menu));
    }
}

activity_main.xml中:

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

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

        <TabWidget
            android:id="@android:id/tabs"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:tag="tabPane" />

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

    </LinearLayout>
</TabHost>

tabhost.xml:

<?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:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:padding="5dp">

        <TabWidget
            android:id="@android:id/tabs"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:tag="tabPane" 
        />

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

            <RelativeLayout
                android:id="@+id/tab_room"
                android:layout_width="fill_parent"
                android:layout_height="fill_parent">

                 <Button
                     android:id="@+id/btnAddTab"
                     android:layout_width="wrap_content"
                     android:layout_height="wrap_content"
                     android:layout_alignParentBottom="true"
                     android:layout_alignParentRight="true"
                     android:onClick="addTab"
                     android:text="Add room" />

                 <TextView
                     android:id="@+id/lblType"
                     android:layout_width="wrap_content"
                     android:layout_height="wrap_content"
                     android:layout_alignParentLeft="true"
                     android:layout_alignParentTop="true"
                     android:layout_marginLeft="20dp"
                     android:layout_marginTop="30dp"
                     android:text="Room type:" />

                 <Spinner
                     android:id="@+id/spinnerType"
                     android:layout_width="wrap_content"
                     android:layout_height="wrap_content"
                     android:layout_alignBottom="@+id/lblType"
                     android:layout_marginLeft="20dp"
                     android:layout_toRightOf="@+id/lblType" />

                 <TextView
                     android:id="@+id/lblWidthX"
                     android:layout_width="wrap_content"
                     android:layout_height="wrap_content"
                     android:layout_alignLeft="@+id/lblType"
                     android:layout_below="@+id/lblType"
                     android:layout_marginTop="30dp"
                     android:text="Dimension 1:" />

                 <TextView
                     android:id="@+id/lblWidthY"
                     android:layout_width="wrap_content"
                     android:layout_height="wrap_content"
                     android:layout_alignLeft="@+id/lblWidthX"
                     android:layout_below="@+id/lblWidthX"
                     android:layout_marginTop="30dp"
                     android:text="Dimension 2:" />

                 <EditText
                     android:id="@+id/txtWidthX"
                     android:layout_width="wrap_content"
                     android:layout_height="wrap_content"
                     android:layout_alignBaseline="@+id/lblWidthX"
                     android:layout_alignBottom="@+id/lblWidthX"
                     android:layout_alignLeft="@+id/txtWidthY"
                     android:layout_alignParentRight="true"
                     android:ems="10" >

                     <requestFocus />
                 </EditText>

                 <EditText
                     android:id="@+id/txtWidthY"
                     android:layout_width="wrap_content"
                     android:layout_height="wrap_content"
                     android:layout_alignBaseline="@+id/lblWidthY"
                     android:layout_alignBottom="@+id/lblWidthY"
                     android:layout_alignParentRight="true"
                     android:layout_toRightOf="@+id/lblWidthY"
                     android:ems="10" />

                 <TextView
                     android:id="@+id/lblFloors"
                     android:layout_width="wrap_content"
                     android:layout_height="wrap_content"
                     android:layout_alignLeft="@+id/lblWidthY"
                     android:layout_below="@+id/txtWidthY"
                     android:layout_marginTop="30dp"
                     android:text="Floors:" />

                 <EditText
                     android:id="@+id/txtFloors"
                     android:layout_width="wrap_content"
                     android:layout_height="wrap_content"
                     android:layout_alignBaseline="@+id/lblFloors"
                     android:layout_alignBottom="@+id/lblFloors"
                     android:layout_alignParentRight="true"
                     android:layout_toRightOf="@+id/lblFloors"
                     android:ems="10" />

            </RelativeLayout>

        </FrameLayout>
    </LinearLayout>
</TabHost>