2010-06-01 30 views
14

questions khác không thể đặt kiểu theo chương trình, nhưng View có thể là được khởi tạo với kiểu như khi được tải từ XML.Tạo Chế độ xem Android với một kiểu cụ thể theo lập trình

Làm cách nào để có thể khởi tạo View bằng một kiểu cụ thể có lập trình (không phải trong XML)? Tôi đã thử sử dụng View(Context context, AttributeSet attrs, int defStyle), nhưng tôi không biết phải phân tích cú pháp gì cho đối số thứ hai. Đi qua trong null kết quả trong số View không được hiển thị

Trả lời

4

AttributeSet chứa danh sách thuộc tính được chỉ định trong xml (ví dụ: layout_width, layout_height v.v.).

Nếu bạn chuyển nó thành giá trị rỗng, thì bạn nên đặt chiều cao/chiều rộng một cách rõ ràng.

+1

'AttributeSet' dường như không có hàm tạo. Có thể xây dựng này mà không sử dụng xml? – Casebash

+0

@Casebash AFAIK, bạn không thể xây dựng AttributeSet mà không sử dụng xml. Bạn có thể thiết lập tất cả các thuộc tính bằng cách sử dụng các hàm do lớp cung cấp. – Karan

13

Tôi đang gặp vấn đề tương tự nhưng chưa tìm thấy cách thực tế nào để trực tiếp đặt kiểu theo chương trình, cho đến thời điểm này. Tôi muốn điền vào màn hình của tôi với rất nhiều widget, của một loại nhất định, chúng ta hãy nói nút. Không thể xác định tất cả chúng trong tệp bố cục. Tôi muốn tạo chúng theo lập trình, nhưng tôi cũng muốn xác định phong cách của chúng trong một tệp xml kiểu.

Giải pháp mà tôi đã đưa ra bao gồm xác định chỉ một trong những tiện ích đó trong tệp bố cục, tạo tất cả các tiện ích khác theo lập trình và sao chép thông tin kiểu từ người đầu tiên đến người khác.

Ví dụ sau.

Trong tệp kiểu, hãy xác định kiểu cho các nút của bạn. Ví dụ:

<style name="niceButton"> 
    <item name="android:layout_width">160dip</item> 
    <item name="android:layout_height">60dip</item> 
    <item name="android:gravity">center</item> 
    <item name="android:textSize">18dip</item> 
    <item name="android:textColor">#000000</item> 
</style> 

Sau đó, lớp con "Nút", bằng cách sinh ra một lớp "NiceButton". Xác định các nhà xây dựng sẽ được cần thiết cho inflater:

public NiceButton(Context context, AttributeSet attrs) { 
    super(context, attrs); 
} 

Sau đó xác định một nhà xây dựng, mà mục đích là để clone một nút hiện:

public NiceButton(int id, NiceButton origButton) { 
    super(origButton.getContext()); 
    setId(id); 
    setLayoutParams(origButton.getLayoutParams()); 
    setGravity(origButton.getGravity()); 
    setPadding(origButton.getPaddingLeft(), 
        origButton.getPaddingTop(), 
        origButton.getPaddingRight(), 
        origButton.getPaddingBottom()); 
    setTextSize(TypedValue.COMPLEX_UNIT_PX, origButton.getTextSize()); 
    setTextColor(origButton.getTextColors()); 
    // ... also copy whatever other attributes you care about 
} 

Trong file layout của bạn, xác định chỉ là một đầu các nút của bạn. Giả sử ví dụ mà bạn muốn đặt nút của bạn trong một bảng:

<TableLayout android:id="@+id/button_table" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content"> 

    <TableRow android:id="@+id/button_row_0"> 
     <com.mydomain.mypackage.NiceButton 
        style="@style/niceButton" android:id="@+id/button_0" /> 
     <!-- More rows/buttons created programmatically --> 
    </TableRow> 

</TableLayout> 

Chú ý rằng tên đủ tiêu chuẩn đầy đủ của lớp phụ tùng được sử dụng; rõ ràng, bạn sẽ phải thay thế com.mydomain.mypackage bằng tên gói thực tế.

Trong hoạt động của bạn, bạn có thể muốn xác định một mảng mà sẽ giữ một tham chiếu đến tất cả các nút, và một người nghe thường được gọi khi một trong các nút được nhấn:

NiceButton[] mButtonViews = new NiceButton[10]; 

private View.OnClickListener mNiceButtonClickListener = new View.OnClickListener() { 
    public void onClick(View view) { 
     int i = view.getId(); 
     mButtonViews[i].setText("PRESSED!"); 
    } 
}; 

Lưu ý cách id chế độ xem được sử dụng làm chỉ mục trong mảng nút. Vì vậy, bạn sẽ cần các nút của bạn để có một id từ 0 đến n-1.

Cuối cùng, đây là cách bạn có thể tạo các nút của bạn trong phương thức onCreate:

// Retrieve some elements from the layout 
    TableLayout table = (TableLayout)findViewById(R.id.button_table); 
    TableRow row = (TableRow)findViewById(R.id.button_row_0); 
    NiceButton origButton = (NiceButton)findViewById(R.id.button_0); 

    // Prepare button 0 
    origButton.setId(0); 
    origButton.setText("Button 0"); 
    origButton.setOnClickListener(mNiceButtonClickListener); 
    mButtonViews[0] = origButton; 

    // Create buttons 1 to 10 
    for (int i = 1; i < 10; i++) { 
     if (i % 2 == 0) { 
      row = new TableRow(this); 
      table.addView(row); 
     } 
     NiceButton button = new NiceButton(i, origButton); 
     button.setText("Button " + i); 
     button.setOnClickListener(mNiceButtonClickListener); 
     mButtonViews[i] = button; 
     row.addView(button); 
    } 

Sau đây là cách màn hình xuất hiện sau khi bạn đã ép một số nút: enter image description here

Vâng, có một số mã có liên quan, nhưng cuối cùng, bạn có thể tạo nhiều tiện ích bạn muốn theo chương trình và vẫn có thuộc tính được định nghĩa là kiểu.

10

Nếu bạn muốn phong cách một cái nhìn bạn có 2 lựa chọn: đơn giản nhất là chỉ cần chỉ định tất cả các yếu tố trong mã:

button.setTextColor(Color.RED); 
button.setTextSize(TypedValue.COMPLEX_UNIT_SP, 18); 

Các tùy chọn khác là để xác định kiểu XML, và áp dụng nó để xem. Trong trường hợp tổng quát, bạn có thể sử dụng một ContextThemeWrapper cho việc này:

ContextThemeWrapper newContext = new ContextThemeWrapper(baseContext, R.style.MyStyle); 
button = new Button(newContext); 

Để thay đổi các thuộc tính văn bản liên quan đến trên TextView (hoặc lớp con của nó như nút) có một phương pháp đặc biệt:

button.setTextAppearance (context, R.style.MyTextStyle);

Điều cuối cùng này không thể được sử dụng để thay đổi tất cả các thuộc tính; ví dụ để thay đổi đệm bạn cần sử dụng ContextThemeWrapper. Nhưng đối với màu văn bản, kích thước, v.v. bạn có thể sử dụng setTextAppearance.

+0

Giải pháp tốt nhất, đơn giản nhất. Cảm ơn bạn. – Steelight

+0

setTextApperance() yêu cầu API 23 – PaulrBear

+1

@PaulrBear, có hai phiên bản, một phiên bản đã được thêm vào API 1 và không được dùng nữa trong phiên bản 23, phiên bản khác được thêm vào trong số 23 – beetstra

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