Android: ปิดใช้งานไฮไลต์ในรายการคลิกดู


302

ฉันต้องการปิดการใช้งานไฮไลท์สีส้มที่เกิดขึ้นเมื่อสัมผัสแถว listView จนถึง xml ของฉันฉันได้ลองทำสิ่งต่อไปนี้แล้ว:

android:focusable="false"
android:focusableInTouchMode="false"
android:clickable="false"

ข้อมูลเพิ่มเติม: ฉันต้องการให้มีความแตกต่างเป็นศูนย์เมื่อผู้ใช้สัมผัสหน้าจอในรายการมุมมองนี้

คำตอบ:


674

เพิ่มไปยัง xml ของคุณ:

android:listSelector="@android:color/transparent"

และสำหรับปัญหานี้อาจใช้งานได้ (ฉันไม่แน่ใจและฉันไม่รู้ว่ามีวิธีแก้ปัญหาที่ดีกว่า):

คุณสามารถใช้ColorStateListกับ TextView ของคุณ


2
หากโปร่งใสยังทำให้การเลือกมืดลงเล็กน้อยอาจจะไม่ได้กำหนดว่าโปร่งใสอย่างสมบูรณ์ ลอง # 00000000 แทนนี่จะมองไม่เห็นเลย
Ridcully

โซลูชั่นที่สมบูรณ์แบบสำหรับฉัน ฉันได้ลองตั้งค่า XML selector แบบโปร่งใสสำหรับพื้นหลังของ listviews ล้อมรอบเลย์เอาท์ แต่สิ่งนี้นำไปสู่แถบสีส้มดังกล่าวบนอุปกรณ์ ICS
Markus Rudel

@RoflcoptrException ฉันใช้Fragmentสำหรับรายการ โครงร่าง XML มีLinearLayoutและTextViewรายการหลายรายการ ฉันควรจะปิดการใช้งานไฮไลต์แถวได้ที่ไหน?
JJD

40
จาก Java Code คุณสามารถทำได้listView.setSelector(android.R.color.transparent);
sulai

@RoflcoptrException -> "คุณสามารถใช้ ColorStateList กับ TextView ของคุณ" - นี่เป็นตัวเลือกที่ดีถ้าแถวรายการไม่สามารถคลิกได้ ทันทีที่คลิกที่ข้อความได้คลิกเหตุการณ์ onClick ของรายการจะไม่เริ่มทำงาน
เซบาสเตียนโฮจาส

189

คำตอบของ RoflcoptrException ควรทำตามลวง แต่ด้วยเหตุผลบางอย่างมันไม่ได้ผลสำหรับฉันดังนั้นฉันจึงโพสต์คำตอบที่เหมาะกับฉันหวังว่ามันจะช่วยให้ใครบางคน

<ListView 
android:listSelector="@android:color/transparent" 
android:cacheColorHint="@android:color/transparent"
/>

101

เอฟเฟกต์ไฮไลท์สีส้มเป็นสไตล์ของ ListView บทความนี้ให้ภาพรวมที่ดีของวิธีการแทนที่ลักษณะ listView

เป็นหลักคุณมีตัวเลือกที่ระบุองค์ประกอบสไตล์ที่แตกต่างกันตามสถานะปัจจุบัน

ดูสิ่งนี้สำหรับคำตอบสั้น ๆ และรวดเร็วhttps://stackoverflow.com/a/12242564/185022


วิธีนี้จะทำให้ฉันมีสไตล์ที่แตกต่างกันสำหรับแต่ละวัตถุ listView หรือไม่ นอกจากนี้ยังเป็นไปได้หรือไม่ที่จะหลีกเลี่ยงปัญหาที่ฉันนำขึ้นมาในคำตอบของ Sebi?
John Moffitt

1
ใช่คุณสามารถลบล้างแอตทริบิวต์สไตล์ใด ๆ คุณสามารถกำหนดสไตล์ให้กับแต่ละ ListView โดยใช้แอตทริบิวต์ style = "@ style / MyStyle" ตามที่อธิบายไว้ในลิงค์แรก
Cheryl Simon

ฉันขอโทษ แต่นี่ไม่ควรเป็นคำตอบ การเปลี่ยนแปลงที่listSelectorควรจะเป็น
Ayman Salah

63

จาก ListView: ปิดใช้งานโฟกัส Highlight ,

เมื่อคุณตั้งค่าให้ListAdapterใช้รหัสต่อไปนี้

ListAdapter adapter = new SimpleCursorAdapter(MyList, Layout, c, 
                new String[] { "Name", "Score" }, to) 
{ 
    public boolean areAllItemsEnabled() 
    { 
        return false; 
    } 
    public boolean isEnabled(int position) 
    { 
        return false; 
    } 
}; 

สิ่งนี้จะแทนที่BaseAdapterชั้นเรียน นอกจากนี้ยังยกเลิกขอบสีขาวระหว่างเซลล์


4
ไม่ถูกต้องนั่นคือปิดใช้งานพฤติกรรมการเลือก (OnItemClicked จะไม่ยิง) สำหรับรายการ
Sandor

6
นี่เป็นวิธีแก้ปัญหาที่ดีเพราะไม่ว่าจะเน้นรายการมุมมองเป็นปัญหาพฤติกรรมมากกว่าความสวยงาม ดังนั้นคุณสามารถใช้สิ่งนี้สำหรับการดูตัวอย่างที่คุณไม่ต้องการให้มีคุณสมบัติในการเลือกได้ สไตล์สากลไม่สมเหตุสมผลนักเนื่องจากคุณรู้ว่าในที่สุดคุณจะต้องการมุมมองรายการที่สามารถเลือกได้และการใช้สไตล์สำหรับพฤติกรรมของฉันดูเหมือนผิด พวกเขาไม่ควรมีความหมายเชิงความหมายเท่านั้นสุนทรียะ คุณสมบัติของการเลือกเป็นสิ่งที่มีความหมาย
โทมัส Dignan

นอกจากนั้นนี่ไม่ใช่คำตอบสำหรับคำถามนี้การแทนที่isEnabledการปิดใช้งานรายการไม่ใช่วิธีการปิดใช้งาน! เอกสารระบุว่าisEnabledควรพิจารณาว่ารายการนั้นเป็นตัวคั่นหรือไม่
Bakhshi

39

เพิ่มสิ่งนี้ไปยัง ur XMl พร้อมกับ listelector .. หวังว่ามันจะใช้ได้

<ListView
android:cacheColorHint="@android:color/transparent"
android:listSelector="@android:color/transparent"/> 

2
ขอบคุณมาก. ฉันต้องการแก้ปัญหาที่ listView ทั้งหมดถูกไฮไลต์ (สีขาวในกรณีของฉัน) เมื่อเลื่อน (เกิดขึ้นก่อน Android 2.3 เท่านั้น) และมันใช้งานได้
เหยิง

"# 00000000" และ "@android: color / transparent" สำหรับความหลากหลายใช่ไหม
Androider

@Androider ya ในปี 2011 ฉันปล่อยให้คนรู้ว่ามันทำงานได้ทั้งสองวิธี ... แน่นอนวันนี้คุณไม่จำเป็นต้อง # 000000
แผ่น

32

หากคุณกำลังใช้ArrayAdapterหรือBaseAdapterเพื่อเติมรายการ วิธีการและผลตอบแทนOverrideisEnabledfalse

 @Override
  public boolean isEnabled (int position) {
    return false;
  }

13

หลังจาก 'google'ing และทดสอบบนอุปกรณ์เสมือนจริงและของจริงสองสามตัวฉันสังเกตว่าโค้ดด้านล่างของฉันใช้งานได้:

ArrayAdapter<String> myList = new ArrayAdapter<String>(this, R.layout.list_item, strText) {
    public boolean isEnabled(int position) 
    { 
            return false; 
    } 
};

สังเกตเห็นว่าฉันได้ละเว้นareAllItemsEnabled()ส่วนนี้


สิ่งนี้ใช้ได้สำหรับฉัน อย่างไรก็ตามมันไม่ได้หมายความว่าหากมี drawable สำหรับแถวที่มีสถานะคนพิการก็จะเปลี่ยนภาพของพวกเขา? เป็นไปได้หรือไม่ที่จะปิดการคลิก แต่ยังไม่สามารถเปลี่ยนแปลงได้
นักพัฒนาซอฟต์แวร์ Android

1
สิ่งนี้มีผลข้างเคียงทำให้ ListView ไม่แสดงตัวแบ่ง
Maciej Pigulski

11

ไม่มีอะไรช่วยฉันได้ แต่นี่:

transparent_drawable.xml:

<?xml version="1.0" encoding="utf-8"?>    
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="#00000000"/>
</shape>

layout.xml:

android:listSelector="@drawable/transparent_drawable"

7

ในรหัส

listView.setSelector(getResources().getDrawable(R.drawable.transparent));

และเพิ่มรูปภาพโปร่งใสขนาดเล็กลงในโฟลเดอร์ drawable

ไลค์: transparent.xml

<?xml version="1.0" encoding="utf-8"?>    
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="#00000000"/>
</shape>

5

สำหรับฉันandroid:focusableInTouchMode="true"เป็นวิธีที่จะไป android:listSelector="@android:color/transparent" ไม่มีประโยชน์ โปรดทราบว่าฉันใช้ listview ที่กำหนดเองพร้อมกับจำนวนวัตถุในแต่ละแถว




1

มีวิธีที่ง่ายและรวดเร็วในการทำสิ่งนี้: ในวิธีการ:

private void OnItemSelected(object sender, SelectedItemChangedEventArgs e)
{
    //TODO
    ((ListView)sender).SelectedItem = null;
}

หวังว่ามันจะช่วย;)


c # not java นี้
Anthony

ฉันคิดว่าโปรแกรมเมอร์ Android ส่วนใหญ่ยังคงใช้จาวาเพราะนั่นคือสิ่งที่ Android Studio รองรับ แต่สามารถใช้ C # ได้ ฉันต้องการชี้แจงว่านี่คือ C #: D
Anthony

0

หากคุณต้องการปิดใช้งานการเน้นสำหรับรายการมุมมองรายการเดียว แต่ยังคงเปิดใช้งานเซลล์ให้ตั้งค่าสีพื้นหลังสำหรับเซลล์นั้นเพื่อปิดใช้งานการเน้น

ตัวอย่างเช่นในโครงร่างเซลล์ของคุณตั้งค่า android:background="@color/white"


0

คุณสามารถรับสิ่งposที่คุณได้รับจากonItemClick และทำ:

listView.setItemChecked(pos, false);

นั่นเป็นวิธีที่ดีที่สุดที่ฉันรู้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.