2011-10-23 6 views
1

이것은 며칠 동안 나를 괴롭혔던 문제입니다. 솔루션을 찾기 위해 최선을 다했으나 현재 사용하고있는 방식이 올바른 방식이라고 말합니다.동일한 레이아웃의 여러 인스턴스를 탭으로 확대시키기

상황은 간단합니다. 예를 들어 레이블 중 하나를 변경하기 위해 setText를 사용하는 것과 같이 약간 다른 내용으로 동일한 레이아웃을 포함 할 다섯 개의 탭이 있습니다. 따라서 레이아웃을 다섯 번 팽창시키고 모든 탭을 별도의 탭으로 추가합니다.

내 코드입니다 :

package com.test; 

import android.app.TabActivity; 
import android.content.res.Resources; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.TabHost; 
import android.widget.TextView; 

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

     TabHost host = getTabHost(); 
     Resources res = getResources(); 

     String[] days = { "Monday", "Tuesday", "Wednesday", "Thursday", "Friday" }; 

     for (int i = 0; i < days.length; i++) 
     { 
      View contents = getLayoutInflater().inflate(R.layout.test, host.getTabContentView(), true); 

      ((TextView)contents.findViewById(R.id.title)).setText(days[i]); 

      host.addTab 
      (
       host.newTabSpec(days[i]). 
       setIndicator(days[i]). 
       setContent(contents.getId()) 
      ); 

      host.getTabWidget().getChildAt(i).getLayoutParams().height = 55; 
     } 
    } 
} 

그리고 내 레이아웃 파일은 다음과 같습니다

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

    <TextView 
     android:id="@+id/title" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Test" 
     android:textAppearance="?android:attr/textAppearanceMedium" /> 

</LinearLayout> 

대신 텍스트가 별도의 탭에있는의 모든 텍스트가 서로 겹치는 문제가 있음 모든 탭에서 동일합니다. 정말 간과할만한 것이있을 것입니다. 어떤 도움을 주셔서 감사합니다.

답변

2
all the text overlaps eachother and is the same for every tab 

그들은 내 발견에서 서로 겹치지 않습니다. 레이아웃 파일에서 android:text="Test"을 삭제하면 모든 탭에서 금요일 만 표시됩니다.

원하는 것을 얻으려면 TabContentFactory을 사용해야 할 것 같습니다. 여기 당신의 문제에 대한 나의 해결책이있다. 그것은 당신에게 필요한 것을 줄 것입니다. 여기

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    final TabHost host = getTabHost(); 
    Resources res = getResources(); 

    final String[] days = { "Monday", "Tuesday", "Wednesday", "Thursday", 
      "Friday" }; 

    for (int i = 0; i < days.length; i++) { 
     TabHost.TabSpec spec=host.newTabSpec(days[i]); 
     spec.setContent(new TabHost.TabContentFactory() { 
      public View createTabContent(String tag) { 
       View wv = getLayoutInflater().inflate(R.layout.test, host.getTabContentView(), false); 
       ((TextView) wv.findViewById(R.id.title)).setText(tag); 
       return(wv); 
      } 
     }); 
     spec.setIndicator(days[i]); 
     host.addTab(spec); 
    } 
    host.setCurrentTab(0); 
} 

내가 https://github.com/commonsguy/cw-android/tree/master/Fancy/DynamicTab

신용 시작 마크 머피 (Commonsguy)로 이동 얻을 링크입니다.

+0

감사합니다! 그게 내 문제를 해결해 줬어. 그것은 나를 궁금해하지만 단풍 ... 내가보기의 새로운 인스턴스를 만들 때마다 내가 틀렸을까요? – Sven

+1

일반적으로 팽창은 새 뷰를 만듭니다. 그러나 이것은'inflate (R.layout.test, host.getTabContentView(), true)'가 아닙니다. 그것은 당신이 팽창 할 때마다 똑같은 시각으로 당신을 돌려 줄 것입니다. – PH7

+0

충분합니다. 감사. – Sven

0

재미있다,하지만 각 탭에 대해 고유 한 텍스트를 통과 할 때 내 문제는 (해결되었다 즉 일 [i]를 대신 상수 "금요일"의 :

TabHost.TabSpec spec=host.newTabSpec(days[i]); 
관련 문제