Bộ chọn và màu văn bản Android


183

Tôi muốn có một đơn giản TextViewđể xử đường simple_list_item_1trong một ListViewkhông. Đây là XML:

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_height="wrap_content" android:layout_width="fill_parent"
    android:gravity="center" android:focusable="true"
    android:minHeight="?android:attr/listPreferredItemHeight"
    android:textAppearance="?android:attr/textAppearanceLarge"
    android:background="@android:drawable/list_selector_background" />

Mọi thứ hoạt động ngoại trừ màu văn bản (dự kiến) không thay đổi ở trạng thái tập trung. Làm thế nào để tôi thay đổi nó textAppearanceLargeInverse?


Trong trường hợp bất cứ ai đang tìm kiếm tệp xml, thì đây là: developer.android.com/resource/samples/Home/res/color/
Kẻ

Câu trả lời:


401

Tôi đã nhận được bằng cách thực hiện một số thử nghiệm cho đến khi một thử nghiệm hoạt động, vì vậy: res / color / button_darkigin.xml

<?xml version="1.0" encoding="utf-8"?>
 <selector xmlns:android="http://schemas.android.com/apk/res/android">
     <item android:state_pressed="true"
           android:color="#000000" /> <!-- pressed -->
     <item android:state_focused="true"
           android:color="#000000" /> <!-- focused -->
     <item android:color="#FFFFFF" /> <!-- default -->
 </selector>

res / layout / view.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:orientation="vertical"
   android:layout_width="fill_parent"
   android:layout_height="fill_parent"
   >
    <Button
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:text="EXIT"
       android:textColor="@color/button_dark_text" />
</LinearLayout>

8
không có Android: ứng dụng có thể vẽ bị hỏng với bộ chọn xml này
neufuture

4
@neufuture: bạn cần sử dụngandroid:textColor="@color/button_dark_text"
Paul

3
Có một tài liệu mô tả các danh sách trạng thái màu: developer.android.com/guide/topics/resource/iêu
Rick77

Vì tò mò, nó cũng hoạt động khi văn bản, nút hoặc bất kỳ mục nào đã được kích hoạt, ví dụ, cho mục danh sách. <item android: state_activated = "true" android: color = "@ android: color / white" />
jiahao

Bộ chọn có nên nằm trong res/colorthư mục không?
mr5

79

Và bộ chọn là câu trả lời ở đây là tốt.

Tìm kiếm sáng bản_daf_f Focused.xml trong các nguồn, thêm vào dự án của bạn trong thư mục res / color và sau đó tham khảo từ TextView như

android:textColor="@color/bright_text_dark_focused"

5
Tôi nghĩ rằng điều này đã thay đổi thành "chính văn bản_dark_f Focused.xml".
greg7gkb

11
Điều này chỉ thổi vào tâm trí của tôi. Tôi đã xử lý mọi thứ với người nghe để thay đổi màu văn bản mọi lúc. Hàm trên sàn. Xuất sắc!
Artem Russakovskii

Không bao giờ nghĩ rằng bộ chọn cũng hoạt động cho textColor, siêu dễ dàng.
Drejc

Tôi đã thử điều này với Bố cục gốc của chế độ xem mà tôi đã tạo cho tôi ListFragmentvà kết thúc với một loạt lỗi . Tôi đang làm gì sai?
MowDownJoe

chúng tôi không thể sử dụng @android: màu / trắng ở đó .. hiển thị hỗ trợ nội dung không khả dụng khi tôi nhấn Ctrl + dấu cách
LOGiah

31

Đây là cách triển khai của tôi, hoạt động chính xác như mục trong danh sách (ít nhất là trên 2.3)

res / layout / list_video_footer.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

    <TextView
        android:id="@+id/list_video_footer"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:background="@android:drawable/list_selector_background"
        android:clickable="true"
        android:gravity="center"
        android:minHeight="98px"
        android:text="@string/more"
        android:textColor="@color/bright_text_dark_focused"
        android:textSize="18dp"
        android:textStyle="bold" />

</FrameLayout>

res / color / sáng bản_dark_f Focused.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:state_selected="true" android:color="#444"/>
    <item android:state_focused="true" android:color="#444"/>
    <item android:state_pressed="true" android:color="#444"/>
    <item android:color="#ccc"/>

</selector>

Điều này hoạt động tốt với tôi và trong trường hợp của tôi hoạt động khá tốt để điều chỉnh các màu được tô sáng / không nổi bật để triển khai Tabhost của tôi
lẻ mét 4/12/2015

27

Để làm cho nó hoạt động trên lựa chọn trong chế độ xem danh sách, sử dụng mã sau đây:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true" android:color="#fff"/>
    <item android:state_activated="true" android:color="#fff"/>
    <item android:color="#000" />
</selector>

Rõ ràng chìa khóa là state_activated="true"nhà nước.


17
Đừng quên đặt tập tin này trong thư mục res / color
Nguyễn Minh Bình

4

Dưới đây là ví dụ về bộ chọn. Nếu bạn sử dụng nhật thực, nó không gợi ý điều gì khi bạn nhấp vào ctrl và dấu cách cả hai: / bạn phải nhập nó.

<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/btn_default_pressed" android:state_pressed="true" />
<item android:drawable="@drawable/btn_default_selected"
    android:state_focused="true"
    android:state_enabled="true"
    android:state_window_focused="true"  />
<item android:drawable="@drawable/btn_default_normal" />

Bạn có thể nhìn vào để tham khảo;

http://developer.android.com/guide/topics/resource/drawable-resource.html#StateList


2

Tôi luôn luôn sử dụng giải pháp trên mà không cần tìm kiếm thêm sau này. ;-)

Tuy nhiên, hôm nay tôi đã bắt gặp một cái gì đó và nghĩ đến việc chia sẻ nó. :)

Tính năng này thực sự có sẵn từ API 1 và được gọi là ColorStateList , nơi chúng tôi có thể cung cấp màu cho các trạng thái khác nhau của Widgets (như chúng ta đã biết).

Nó cũng là tài liệu rất tốt, ở đây.


2

Trong res/colorvị trí một file "text_selector.xml":

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:color="@color/blue" android:state_focused="true" />
    <item android:color="@color/blue" android:state_selected="true" />
    <item android:color="@color/green" />
</selector>

Sau đó, TextViewsử dụng nó:

<TextView
    android:id="@+id/value_1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="Text"
    android:textColor="@color/text_selector"
    android:textSize="15sp"
    />

Và trong mã bạn sẽ cần thiết lập một trình nghe nhấp chuột.

private var isPressed = false

private fun TextView.setListener() {
    this.setOnClickListener { v ->
        run {
            if (isPressed) {
                v.isSelected = false
                v.clearFocus()
            } else {
                v.isSelected = true
                v.requestFocus()
            }
            isPressed = !isPressed
        }
    }
}

override fun onResume() {
    super.onResume()
    textView.setListener()
}

override fun onPause() {
    textView.setOnClickListener(null)
    super.onPause()
}

Xin lỗi nếu có lỗi, tôi đã thay đổi mã trước khi xuất bản và không kiểm tra.


1

Nếu sử dụng TextViews trong các tab, định nghĩa bộ chọn này hoạt động với tôi (đã thử Klaus Balduino nhưng không được):

<?xml version="1.0" encoding="utf-8"?>    
<selector xmlns:android="http://schemas.android.com/apk/res/android">

  <!--  Active tab -->
  <item
    android:state_selected="true"
    android:state_focused="false"
    android:state_pressed="false"
    android:color="#000000" />

  <!--  Inactive tab -->
  <item
    android:state_selected="false"
    android:state_focused="false"
    android:state_pressed="false"
    android:color="#FFFFFF" />

</selector>

0

Bạn đã thử setOnFocusChangeListenerchưa Trong trình xử lý, bạn có thể thay đổi giao diện văn bản.

Ví dụ:

TextView text = (TextView)findViewById(R.id.text);
text.setOnFocusChangeListener(new View.OnFocusChangeListener() {
    public void onFocusChange(View v, boolean hasFocus) {
        if (hasFocus) {
            ((TextView)v).setXXXX();
        } else {
            ((TextView)v).setXXXX();
        }
    }
});

Sau đó, bạn có thể áp dụng bất kỳ thay đổi nào bạn muốn khi nó tập trung hay không. Bạn cũng có thể sử dụng ViewTreeObserver để lắng nghe những thay đổi tập trung toàn cầu.

Ví dụ:

View all = findViewById(R.id.id_of_top_level_view_on_layout);
ViewTreeObserver vto = all.getViewTreeObserver();
vto.addOnGlobalFocusChangeListener(new ViewTreeObserver.OnGlobalFocusChangeListener() {
    public void onGlobalFocusChanged(
        View oldFocus, View newFocus) {
        // xxxx
    }
});

Tôi hy vọng điều này sẽ giúp hoặc cung cấp cho bạn ý tưởng.


1
Tôi đã đi theo cách này ban đầu nhưng màu văn bản không thay đổi vì một số lý do.
yanchenko
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.