16

TabHost을 사용하는 Android 애플리케이션 (1.6 호환성)을 업그레이드하기 위해 노력하고 있습니다. 중첩 된 활동과 함께 3 개의 다른 탭을 표시합니다.Android 1.6 & Fragment & Tabhost

당시에는 ActivityGroup 트릭을 사용하여 탭에 중첩 된 활동을 표시했지만 일부 기능을 처리하는 것은 정말 고통 스럽기 때문에이 방법에 불만이 있습니다.

Fragments API 호환성 패키지에 대해 1.6으로 알았고 Fragment은 내가하고 싶은 것을 완벽하게 보이지만 (전환 효과와 물건으로 탭 내에 중첩 된보기/기능 표시) 완벽하게 보이지만 TabHost (이는 Action Bar으로 작동하도록되어 있었지만 호환 패키지에서는 제공되지 않습니다).

여러분의 응용 프로그램에서 이러한 구조를 만드는 방법을 찾은 사람이 있습니까?

내 오류가 여기에 있습니다 :

ERROR/AndroidRuntime(955): Caused by: java.lang.RuntimeException: Unable 

활동을 시작 ComponentInfo {com.XXX} : java.lang.IllegalArgumentException가 : 조각 MyFragment에 대한 ID를 0x1020011에 대한 찾을 수 없습니다 보기

코드

,

main.xml에

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

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

     <TabWidget 
      android:id="@android:id/tabs" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:layout_weight="0" /> 

    </LinearLayout> 

</TabHost> 

MainActivity.java

public class MainActivity extends TabActivity { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState); 

     setContentView(R.layout.main); 

     Resources res = getResources(); 
     final TabHost tabs = getTabHost(); 
     TabHost.TabSpec spec; 
     Intent i; 

     i = new Intent(this, MyActivity.class); 
     spec = tabs.newTabSpec("MyActivity").setIndicator("MyActivity",res.getDrawable(R.drawable.tab)).setContent(i); 
     tabs.addTab(spec); 

    } 

} 

MyActivity.class

public class MyActivity extends FragmentActivity { 

    private static String TAG = "MyActivity"; 
    private static FragmentManager fragmentManager; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState); 
     fragmentManager = getSupportFragmentManager(); 
     FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
     ListeResultatFragment fragment = MyFragment.newInstance(); 
     fragmentTransaction.add(android.R.id.tabcontent, fragment, "MyFragment"); 
     fragmentTransaction.commit(); 

    } 

} 
,

MyFragment.java

public class MyFragment extends Fragment { 

    public static MyFragment newInstance() { 
     MyFragment instance = new MyFragment(); 
     return instance; 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     return inflater.inflate(R.layout.fragment, container, false); 
    } 

} 
+0

''요소를'TabHost'에서'FrameLayout'의 자식으로 사용할 수 없다는 말입니까? 나는 이것이 작동 할 것으로 기대했을 지 모르지만 나는 아직 그것을 개인적으로 시도하지 않았다. – CommonsWare

+0

정확하게 작동하지 않는 이유를 설명하십시오. 프로그래밍 방식으로 단편을 추가 할 수 있다는 것을 기억하십시오. – oriharel

+0

코드가 추가되었습니다. – Vivi

답변

10

MyActivityandroid.R.id.tabcontent을 컨테이너 ID로 사용하여 첨부 된 MainActivity에 연락하려고합니다. 이건 불가능 해. 대신 MyActivity은 Fragment의 부모로 사용할 수있는 자체 레이아웃 (예 : FrameLayout)이 있어야합니다. 이 레이아웃에는 id로 참조 할 수있는 뷰가 있어야합니다.

activity_layout.xml이라는 레이아웃에 id가 'framelayout'인 FrameLayout이 포함되어 있다고 가정 해 보겠습니다.그런 다음 이런 식으로 MyActivityonCreate 방법을 수정할 수 있습니다 즉

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    View parent = getLayoutInflater().inflate(R.layout.activity_layout, null); 
    setContentView(parent); 

    fragmentManager = getSupportFragmentManager(); 
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
    Fragment fragment = MyFragment.newInstance(); 
    fragmentTransaction.add(R.id.framelayout, fragment, "MyFragment"); 
    fragmentTransaction.commit(); 
} 

MyActivity는 자신의 작업을 할 수 있어야합니다. 먼저 작동되도록 설정 한 다음 TabHost가 포함 된 MainActivityMyActivity을 삽입합니다.

4

왜 당신이 당신의 자신의 TabBar의를 생성하지 않습니다. 그것은 verry 쉽게 구축 할 수 있습니다. LinearLayout에 버튼을 몇 개 추가하고 onClickListener를 설정하여 FragmentManager를 사용하여 조각을 전환하십시오. FragmentActivity에서 Fragment manager를 얻을 수 있습니다.

FragmentManager fragmentManager = getSupportFragmentManager(); 

onClick 처리기에서 올바른 조각으로 전환하기 만하면됩니다.

관련 문제