2013-03-09 66 views
0

强制性背景信息:我正在为房地产经纪人在引用房屋和建筑物时使用平板应用程序。由于家庭或公寓可以拥有任意数量的房间,因此我认为建立一个基于标签的解决方案是非常好的,该解决方案允许逐个房间并按需为每个房间创建一个标签。Android - 如何使用现有布局按需创建选项卡?

我经历过几个选项卡教程,但所有的解决方案,我发现处理标签的预定数量,并使用过时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; 
    } 
}); 

问题:我想重新使用新标签,将现有的布局,并以某种方式保留多少选项卡已创建至今计数。

+0

描述了更多你的问题?你是否试图从你的程序中动态地在tabhost中添加tab tab?你试过了什么,你遇到了什么问题 – stinepike 2013-03-10 06:03:03

+0

嗯,是的,我试图动态添加新标签,而不是简单地通过XML文件来定义它们。它们都应该包含相同的GUI元素。我可以创建新标签,但我不知道如何告诉它使用与第一个标签相同的布局。 – 2013-03-11 00:38:31

回答

0

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

桑卡尔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> 
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" /> 

希望你会发现THI这很有帮助

+0

试过了。工程,但我看不到任何标签按钮了。我尝试点击标签应该去的地方,并且我得到一个IllegalStateException异常,询问我是否忘记调用setup(LocalActivityManager activityGroup)。 – 2013-03-11 21:14:59

+0

解决了上一个问题(解决方案在http://stackoverflow.com/questions/9409735/java-lang-illegalstateexception-at-tabhost-addtabspec),但我得到一个有趣的行为:整个布局正在复制和部分覆盖,每次按“添加标签”按钮一次... – 2013-03-11 21:31:05

相关问题