16

Tôi đang làm việc để nâng cấp ứng dụng Android (1.6 khả năng tương thích) sử dụng TabHost để hiển thị 3 tab khác nhau có hoạt động lồng nhau.Android 1.6 & Fragment & Tabhost

Lúc đó tôi đã sử dụng thủ thuật ActivityGroup để hiển thị các hoạt động lồng nhau trong tab nhưng tôi rất không hài lòng với phương pháp này vì đó là một nỗi đau thực sự để xử lý một số tính năng.

Tôi đã nghe về gói tương thích API Fragments cho 1.6 và Fragment trông hoàn hảo cho những gì tôi muốn làm (hiển thị các chế độ xem/tính năng lồng nhau trong tab có hiệu ứng chuyển tiếp và nội dung) nhưng tôi không thể làm việc với TabHost (Nó có nghĩa là để làm việc với một Action Bar nhưng nó không có sẵn trong gói tương thích).

Có ai trong số các bạn đã tìm thấy cách tạo cấu trúc như vậy trong các ứng dụng của mình không?

lỗi của tôi ở đây là:

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

để bắt đầu hoạt động ComponentInfo {com.XXX}: java.lang.IllegalArgumentException: Không xem tìm thấy cho id 0x1020011 cho đoạn MyFragment

CODE

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

Bạn có nói rằng bạn không thể đặt các phần tử '' là con của 'FrameLayout' trong' TabHost'? Tôi đã có thể mong đợi điều này để làm việc, nhưng tôi đã không thử nó cá nhân nào được nêu ra. – CommonsWare

+0

hãy giải thích chính xác những gì tôi không làm việc. Hãy nhớ rằng bạn luôn có thể thêm các đoạn lập trình. – oriharel

+0

Mã đã thêm guys :) – Vivi

Trả lời

10

Vấn đề là MyActivity của bạn sẽ cố gắng liên hệ với số MainActivity kèm theo bằng cách sử dụng android.R.id.tabcontent làm id vùng chứa. Điều này là không thể. Thay vào đó, MyActivity cần phải có bố cục riêng (ví dụ: FrameLayout) có thể được sử dụng làm bố cục cho Phân đoạn. Trong bố cục này, phải tồn tại một chế độ xem có thể được tham chiếu theo id.

Giả sử bạn có bố cục được gọi là activity_layout.xml có chứa FrameLayout có id 'framelayout'.Sau đó bạn có thể thay đổi phương pháp onCreate trong MyActivity một cái gì đó như thế này:

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

Nói cách khác, MyActivity cần để có thể làm việc trên riêng của mình. Hãy cố gắng làm cho nó hoạt động đầu tiên, và sau đó nhúng MyActivity trong các MainActivity chứa các TabHost.

4

Tại sao bạn không tạo thanh tabbar của riêng bạn. Thật dễ dàng để xây dựng. Chỉ cần thêm một LinearLayout với một số nút trong đó và thiết lập onClickListener để chuyển đổi các đoạn bằng cách sử dụng FragmentManager. Trình quản lý Fragment có thể thu được từ FragmentActivity.

FragmentManager fragmentManager = getSupportFragmentManager(); 

Trong trình xử lý onClick bạn chỉ thực hiện giao dịch để chuyển sang các đoạn chính xác.

Các vấn đề liên quan