Nút Android có biểu tượng và văn bản


93

Tôi có một số nút như thế này trong ứng dụng của mình:

    <Button
        android:id="@+id/bSearch"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:padding="16dp"
        android:text="Search"
        android:textSize="24sp" />

Tôi đang cố tạo một nút giống với văn bản và biểu tượng. android: drawableLeft không hoạt động đối với tôi (Có thể có, nhưng tôi không biết cách đặt chiều cao tối đa cho biểu tượng).

Vì vậy, tôi đã tạo LinearLayout với ImageView và TextView và làm cho nó hoạt động giống như một nút:

    <LinearLayout
        android:id="@+id/bSearch2"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:background="@android:drawable/btn_default"
        android:clickable="true"
        android:padding="16dp"
        android:orientation="horizontal" >

        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:layout_marginLeft="5dp"
            android:adjustViewBounds="true"
            android:maxHeight="30dp"
            android:maxWidth="30dp"
            android:scaleType="fitCenter"
            android:src="@drawable/search_icon" />

        <TextView
            android:id="@+id/tvSearchCaption"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:textSize="24sp"
            android:paddingRight="30dp"
            android:gravity="center"
            android:text="Search" />
    </LinearLayout>

Nút mới của tôi là chính xác những gì tôi muốn (kích thước phông chữ, biểu tượng và vị trí văn bản). Nhưng nó không giống các nút mặc định của tôi:

nhập mô tả hình ảnh ở đây

Vì vậy, tôi đã thử, để thay đổi nền và màu văn bản của Nút mới của mình:

Button Search = (Button) findViewById(R.id.bSearch);
LinearLayout bSearch2 = (LinearLayout) findViewById(R.id.bSearch2);
bSearch2.setBackground(bSearch.getBackground());
TextView tvSearchCaption = (TextView)findViewById(R.id.tvSearchCaption);
tvSearchCaption.setTextColor(bSearch.getTextColors().getDefaultColor());

Điều này cho một kết quả kỳ lạ, nút cũ của tôi, bị lộn xộn:

nhập mô tả hình ảnh ở đây

Khi tôi thay đổi thứ tự của hai nút này trong XML, vì vậy "nút mới" đi trước, nó tạo ra một kết quả kỳ lạ khác:

nhập mô tả hình ảnh ở đây

Bây giờ tôi nhận thấy rằng khi tôi cố gắng nhấn nút cũ, nút mới sẽ được nhấn.

Có ý kiến ​​gì không?

Câu trả lời:


284

Hãy thử cái này.

<Button
    android:id="@+id/bSearch"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:padding="16dp"
    android:text="Search"
    android:drawableLeft="@android:drawable/ic_menu_search"
    android:textSize="24sp"/>

3
Điều đó trông chính xác như cách tôi muốn, nhưng tôi muốn sử dụng các biểu tượng của riêng mình, không phải các biểu tượng Android mặc định. Các biểu tượng của tôi có kích thước lớn hơn. Điều đó có nghĩa là tôi cần tạo các bitmap nhỏ hơn cho mọi độ phân giải? Có một số tham số cho phép tôi kiểm soát kích thước biểu tượng không?
Dusan

Đúng rồi. Bạn cần tạo kích thước hình ảnh khác nhau cho mỗi độ phân giải
Liem Vo

Được rồi, cảm ơn sự giúp đỡ của bạn, nhưng bây giờ tôi có một câu hỏi khác ... Các biểu tượng của tôi là màu sáng, vì văn bản màu trắng trên một nút tối, giống như bạn có thể thấy trong hình ảnh trong câu hỏi của tôi. Ứng dụng được thiết lập, sử dụng chủ đề có sẵn trong phiên bản Android. Ví dụ của tôi là từ android 4.3. Khi ứng dụng chạy trên android 2.3.3, các nút mặc định sáng với văn bản tối. Kinda một cái gì đó giống như nút trên hình ảnh đầu tiên của tôi. Có cách nào để cung cấp một bitmap thay thế cho biểu tượng chạy trên các thiết bị cũ hơn không. Tôi hy vọng bạn hiểu câu hỏi của tôi :)
Dusan

Đó là một câu hỏi hay. Bạn có thể xác định phong cách khác nhau cho biểu tượng của mình, văn bản mát hơn theo phong cách cho từng cấp API (có nghĩa là phiên bản hệ điều hành android). Bạn có thể thấy các thư mục giá trị-v11, giá trị-v14.
Liem Vo

2
Bạn cũng có thể thêm padding vào biểu tượng android: drawablePadding = ""
Asad Mirza.

15

Để thêm hình ảnh vào trái, phải, trên hoặc dưới, bạn có thể sử dụng các thuộc tính như sau:

android:drawableLeft
android:drawableRight
android:drawableTop
android:drawableBottom

Mã mẫu được đưa ra ở trên. Bạn cũng có thể đạt được điều này bằng cách sử dụng bố cục tương đối.


Làm cách nào để thực hiện việc này theo chương trình
Sujay UN

1
Bạn có thể nói android:drawableStartthay vì Trái và android:drawableEndthay vì Phải.
Simão Garcia

@ SimãoGarcia * nên. Bắt đầu nên thay thế bên phải và kết thúc nên thay thế bên trái ở tất cả các nơi. Điều này là để đảm bảo rằng đọc từ phải sang trái cũng như đọc từ trái sang phải đều khả dụng vì một số quốc gia khác có cách đọc khác nhau.
Carson J.

11

Đối với bất kỳ ai muốn thực hiện điều này một cách động thì setCompoundDrawables(Drawable left, Drawable top, Drawable right, Drawable bottom)đối tượng nút sẽ hỗ trợ.

Mẫu vật

Button search = (Button) findViewById(R.id.yoursearchbutton);
search.setCompoundDrawables('your_drawable',null,null,null);

5
Sử dụng setCompoundDrawables không phản ánh trên giao diện người dùng. Đã sử dụng setCompoundDrawablesWithIntriualityBounds thay thế và điều đó đã hoạt động.
Aldo

5

Đây là những gì bạn thực sự muốn.

<Button
       android:id="@+id/settings"
       android:layout_width="190dp"
       android:layout_height="wrap_content"
       android:layout_gravity="center_horizontal"
       android:background="@color/colorAccent"
       android:drawableStart="@drawable/ic_settings_black_24dp"
       android:paddingStart="40dp"
       android:paddingEnd="40dp"
       android:text="settings"
       android:textColor="#FFF" />

4

Bạn có thể sử dụng Thư viện Thành phần Vật liệu và MaterialButtonthành phần.
Sử dụng các thuộc tính app:iconapp:iconGravity="start".

Cái gì đó như:

  <com.google.android.material.button.MaterialButton
        style="@style/Widget.MaterialComponents.Button.Icon"
        app:icon="@drawable/..."
        app:iconGravity="start"
        ../>

nhập mô tả hình ảnh ở đây


Lưu ý rằng nếu bạn có chủ đề material design cho ứng dụng của mình, tiện ích Nút tiêu chuẩn sẽ tự động thổi phồng lên dưới dạng MaterialButton. Theo đây - material.io/develop/android/components/buttons
dodgy_coder

2

Câu trả lời của @Liem Vo là đúng nếu bạn đang sử dụng android.widget.Button mà không cần ghi đè. Nếu bạn đang ghi đè chủ đề của mình bằng MaterialComponents, điều này sẽ không giải quyết được vấn đề.

Vì vậy, nếu bạn là

  1. Sử dụng com.google.android.material.button.MaterialButton hoặc
  2. Ghi đè AppTheme bằng MaterialComponents

Sử dụng ứng dụng: thông số biểu tượng .

<Button
    android:id="@+id/bSearch"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:padding="16dp"
    android:text="Search"
    android:textSize="24sp"
    app:icon="@android:drawable/ic_menu_search" />
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.