2012-03-24 14 views
1

Ich arbeite an einer Android-Anwendung mit einer Aktivität, die ein Tab-Layout verwendet. Es gibt zwei Registerkarten, die zwischen den in einigen TextViews angezeigten Inhalten wechseln.Wie wird das gleiche Layout für zwei verschiedene Tabs in einem TabHost angezeigt?

Dies bedeutet, dass die beiden Register-Spezifikationen auf den gleichen Layout zeigen (linear) für Inhalt, 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> 

Das funktioniert aber nur, wenn ich Sie auf die Registerkarte Schalter 2 und zurück auf 1, dh wenn die Aktivität gestartet wird, kann das Layout "plantilla" nicht mehr gesehen werden, bevor Tabs geändert werden. Das ist mein Problem.

Was ist der einfachste Weg, um dies zu umgehen?

PD: Ich habe versucht, die Linie

<include layout="@layout/plantilla"> 

im TabHost xml zu duplizieren, aber in diesem Fall kann ich auf nicht an den Textviews Objekten aus dem Java-Code mit findViewById (R.id.someTextView) ;

Antwort

0

Bitte entfernen Sie den Tag aus Ihrem XML-Layout enthalten und einfach etwas verlassen:

<?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> 

Und von Ihrer TabActivity Klasse setzt dies nur in 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 

Sie verschiedene Aktivitäten erstellen für Ihre Tabs oder verwenden Sie einen einzigen.

+0

Danke Freund, aber diese Methode hilft mir nicht, weil ich keine Aktivität nach Tab haben möchte. Ich möchte eine einzelne Aktivität, die TabActivity, die je nach Tab verschiedene Inhalte anzeigt. Der auf den einzelnen Registerkarten angezeigte Inhalt wird von einem privaten Objekt mit der TabActivity gelesen. Wenn ich mehr als eine Aktivität habe, muss ich dieses Objekt unter den Aktivitäten teilen, die meiner Meinung nach komplexer sind als das gleiche Layout für zwei Registerkarten. – cs4r

1

Ich glaube nicht, dass Sie Include verwenden können, ich denke, Sie müssen Ihr Layout zweimal in der XML mit verschiedenen ID-Tags definieren.

Oder Sie könnten einfach die Containeransicht definieren und dann automatisch Ansichten hinzufügen. Das habe ich schon mal gemacht. Hier ist, wie ich es tat:

tablayout

<?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> 

Es folgt mein Register Aktivität (Ich habe wesentliche Teile entfernt, aber es sollte gut genug zeigen, wie ich ging über Tabs ohne separate Aktivitäten für jeden tun Tab).

tabactivity

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); 
    } 

} 

Hoffnung, das hilft.