2011-07-12 12 views
7

Tôi gặp sự cố khi nhận vị trí của trẻ là LinearLayout. Đầu tiên tôi thêm động một số nút và sau đó tôi đang cố gắng trả lại chỉ mục của từng trẻ và hiển thị nó thành một văn bản TextView. mã ở đây tôi chia sẻ:Tự động thêm con vào LinearLayout với vị trí của mỗi đứa trẻ

nguồn java:

private String[] categories; 

private LinearLayout ll; 
private TextView tv; 

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

    categories = getResources().getStringArray(R.array.categories); 

    tv = (TextView) findViewById(R.id.text); 
    ll = (LinearLayout) findViewById(R.id.hsvLinearLayout); 

    for(int i = 0; i < categories.length; i++) { 
     Button btn = new Button(this); 
     btn.setText(categories[i]); 
     btn.setOnClickListener(buttonClick); 
     ll.addView(btn); 
    } 
} 

OnClickListener buttonClick = new OnClickListener() { 
    public void onClick(View v) { 
     tv.setText(ll.indexOfChild(v)); 
    } 
}; 

cấu trúc xml:

<LinearLayout 
xmlns:android="http://schemas.android.com/apk/res/android" 
android:orientation="horizontal" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
> 

<HorizontalScrollView 
    android:id="@+id/Footer" 
    android:orientation="horizontal" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:scrollbars="none" 
    android:fadingEdge="none" 
    > 

    <LinearLayout 
     android:id="@+id/hsvLinearLayout" 
     android:orientation="horizontal" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     > 

    </LinearLayout> 

</HorizontalScrollView> 

<TextView 
    android:id="@+id/text" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    /> 

nguồn:

<string name="today">Today</string> 
<string name="life">Life</string> 
<string name="corner">Corner</string> 
<string name="banks">Banks</string> 
<string name="it">IT</string> 
<string name="fun">Fun</string> 

<array name="categories"> 
    <item>@string/today</item> 
    <item>@string/life</item> 
    <item>@string/corner</item> 
    <item>@string/banks</item> 
    <item>@string/it</item> 
    <item>@string/fun</item> 
</array> 

Tính năng thêm động là tốt, nhưng cách tôi đang đặt OnClickListener sẽ xuất hiện một số lỗi. Bất kỳ trợ giúp sẽ hữu ích! Mục đích của điều đó là nếu tôi muốn thêm một hoặc nhiều nút vào số HorizontalScrollView không cần thiết để chỉnh sửa nhiều tệp và chỉ cần truy cập sting.xml và tạo một mục mới vào các danh mục -array!

Đây là những gì LogCat sản xuất:

07-12 22:37:17.680: INFO/System.out(331): waiting for debugger to settle... 
07-12 22:37:17.900: INFO/System.out(331): debugger has settled (1441) 
07-12 22:37:20.870: INFO/ActivityManager(61): Displayed activity com.test/.TestDynam: 10203 ms (total 10203 ms) 
07-12 22:37:25.552: WARN/ResourceType(331): No package identifier when getting value for resource number 0x00000000 
07-12 22:37:26.871: DEBUG/dalvikvm(132): GC freed 190 objects/8976 bytes in 901ms 

Để làm rõ - các ứng dụng khởi động mà không cần bất kỳ lỗi nào, nhưng khi tôi bấm vào một nút nó tạo ra dòng này từ nhật ký trên:

07-12 22:37:25.552: WARN/ResourceType(331): No package identifier when getting value for resource number 0x00000000 

Và đây là từ trình gỡ lỗi:

TestDynam [Android Application] 
    DalvikVM[localhost:8611]  
     Thread [<3> main] (Suspended (exception Resources$NotFoundException)) 
      ViewRoot.handleMessage(Message) line: 1704 
      ViewRoot(Handler).dispatchMessage(Message) line: 99 
      Looper.loop() line: 123 
      ActivityThread.main(String[]) line: 4203  
      Method.invokeNative(Object, Object[], Class, Class[], Class, int, boolean) line: not available [native method] 
      Method.invoke(Object, Object...) line: 521 
      ZygoteInit$MethodAndArgsCaller.run() line: 791 
      ZygoteInit.main(String[]) line: 549 
      NativeStart.main(String[]) line: not available [native method] 
     Thread [<13> Binder Thread #2] (Running)  
     Thread [<11> Binder Thread #1] (Running) 

Trả lời

12

vấn đề của bạn là nguồn .... bạn sử dụng phương thức setText (int) (chỉ số đó là int ...) mà sẽ tìm kiếm nguồn lực và không dây, đây không phải là StringBuilder mà bạn có thể ném bất kỳ loại nào và nhận được một chuỗi. bạn cần phải thay thế

tv.setText (ll.indexOfChild (v));

với

tv.setText (Integer.toString (ll.indexOfChild (v)));

và nếu bạn muốn, ngay cả một chút hiệu quả:

public class TestActivity extends Activity { 

    private String[] categories; 

    private LinearLayout ll; 
    private TextView tv; 

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

     categories = getResources().getStringArray(R.array.categories); 

     tv = (TextView) findViewById(R.id.text); 
     ll = (LinearLayout) findViewById(R.id.hsvLinearLayout); 

     for(int i = 0; i < categories.length; i++) { 
      Button btn = new Button(this); 
      btn.setText(categories[i]); 
      btn.setOnClickListener(buttonClick); 
      ll.addView(btn); 
      int idx = ll.indexOfChild(btn); 
      btn.setTag(Integer.toString(idx)); 
     } 
    } 

    OnClickListener buttonClick = new OnClickListener() { 
     public void onClick(View v) { 
      String idxStr = (String)v.getTag(); 
      tv.setText(idxStr); 
     } 
    }; 

} 
+0

... hoặc' tv.setText ("" + ll.indexOfChild (v)); 'anyway cảm ơn rất nhiều, chẳng hạn một sai lầm nhỏ! – nenito

+0

cảm ơn bạn nó rất hữu ích :) –

2

Bạn phải setContentView trước khi bắt đầu findViewById

setContentView(R.layout.main); 
tv = (TextView) findViewById(R.id.text); 
+0

Tôi không nghĩ rằng đây là vấn đề và tại sao bạn nghĩ rằng tôi nên gọi 'setContentView() 'trước khi' findViewById() ' ? – nenito

+0

setContentView sẽ thổi phồng tài nguyên bố cục và tạo ViewGroup đại diện cho tài nguyên bố cục đó. Từ ViewGroup đó, bạn có thể sử dụng findViewById để xem con. –

+0

Nó không hoạt động, những gì bạn vừa viết! – nenito