2010-05-31 6 views
5

Tôi có một hoạt động trên Android mà tôi đang sử dụng các tab.Tại sao tôi gặp lỗi khi cố gắng đặt nội dung của tabspec trong android?

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

    TabHost tabHost = getTabHost(); 
    TabSpec spec; 

    spec = tabHost.newTabSpec("controls"); 
    spec.setIndicator("Control"); 
    spec.setContent(R.layout.unit_control); 
    tabHost.addTab(spec); 

    spec = tabHost.newTabSpec("data"); 
    spec.setIndicator("Data"); 
    spec.setContent(R.layout.unit_data); 
    tabHost.addTab(spec); 
    } 
} 

Tuy nhiên khi tôi chạy chương trình nó bị treo với lỗi: "Không thể tạo nội dung tab vì không thể tìm thấy điểm với id 2130903042". Tôi không hiểu vấn đề là gì vì R.layout.unit_data đề cập đến một file layout trong thư mục tài nguyên của tôi (res/layout/unit_data.xml)

<?xml version="1.0" encoding="utf-8"?> 
    <ScrollView xmlns:android="http://schemas.android.com/apk/res/android" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent"> 
    <TableLayout 
     android:stretchColumns="*" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent"> 
    <Spinner android:id="@+id/unit_num" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:prompt="@string/choose_unit"/> 
    <TableRow android:padding="2dp"> 
     <TextView 
      android:gravity="right" 
      android:padding="5dp" 
      android:text="@string/Power"/> 
     <TextView android:id="@+id/unit_power" 
      android:layout_span="3" 
      android:gravity="center" 
      android:padding="5dp" 
      android:background="@android:color/white" 
      android:textColor="@android:color/black" 
      android:text="AUTO"/> 
    </TableRow> 
    ... 
    </TableLayout> 
</ScrollView> 

như xa như tôi có thể nói là unit_data.xml được hình thành tốt và thậm chí tôi đã tham chiếu nó thành công trong một hoạt động khác

class UnitData extends Activity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.unit_data); 
    Toast.makeText(this, "Hi from UnitData.onCreate", 5); 
    } 
} 

không đưa ra lỗi và hiển thị bố cục tốt.

Điều gì đang xảy ra? Tại sao tôi không thể tham chiếu bố cục này khi tạo tab?

Trả lời

9

Trong khi Activity.setContentView lấy id của Bố cục, TabSpec.setContent lấy id của Chế độ xem. Điều này có nghĩa là bạn cần chuyển một id trông giống như R.id.something và không phải là R.layout.something.

Để giải quyết vấn đề cụ thể của bạn, cung cấp cho các quan điểm cấp cao nhất trong cách bố trí của bạn một id xem:

<?xml version="1.0" encoding="utf-8"?> 
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:id="@+id/unit_data"> <!-- NOTE THE CHANGE --> 
    ... 
</ScrollView> 

và cập nhật nguồn của bạn:

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

    TabHost tabHost = getTabHost(); 
    TabSpec spec; 

    spec = tabHost.newTabSpec("controls"); 
    spec.setIndicator("Control"); 
    spec.setContent(R.id.unit_control); // NOTE THE CHANGE 
    tabHost.addTab(spec); 

    spec = tabHost.newTabSpec("data"); 
    spec.setIndicator("Data"); 
    spec.setContent(R.id.unit_data); // NOTE THE CHANGE 
    tabHost.addTab(spec); 
    } 
} 

Để biết thêm thông tin, xem các ví dụ tab trong số ApiDemos:

+0

Cảm ơn một lời khuyên. Bạn nói đúng, một phần của vấn đề của tôi là bởi vì tôi đã sử dụng một tham chiếu R.layout (trông rất giống với một tham chiếu id đã ném tôi đi). Tôi cũng nghĩ rằng id được tham chiếu theo cách này phải ở trong chế độ xem được tham chiếu bởi @android: id/tabcontent. Tôi đọc đề cập đến ở nơi khác và thử nghiệm của riêng tôi dường như hỗ trợ nó. – rushinge

5

Bạn cũng phải sử dụng LayoutInflater sau TabHost

LayoutInflater.from (this) .inflate (R.layout.unit_data, tabHost.getTabContentView(), true);

Tôi cũng bị mắc kẹt với điều này và cuối cùng con số nó ra.

7

Nếu bạn có bố cục tab trong một tệp khác, bạn phải tăng cấp XML.

spec = tabHost.newTabSpec("data"); 
spec.setIndicator("Data"); 
// Add the layout to your tab view 
getLayoutInflater().inflate(R.layout.unit_data, tabHost.getTabContentView(), true); 
spec.setContent(R.id.unit_data); 
tabHost.addTab(spec);