ไอคอนรายการลิ้นชักการนำทางไม่แสดงสีดั้งเดิม


138

ฉันกำลังพยายามแสดงไอคอนที่อยู่ถัดจากรายการในเมนูของฉันสำหรับลิ้นชักการนำทางของฉัน แต่ด้วยเหตุผลบางประการไอคอนจะปรากฏเป็นสีเทาเสมอแทนที่จะเป็นสีดั้งเดิม (สีน้ำตาล) มีวิธีการป้องกันไม่ให้สิ่งนี้เกิดขึ้นเพื่อแสดงสีดั้งเดิมของไอคอนหรือไม่?

MainActivity.java

public class MainActivity extends AppCompatActivity {

    private DrawerLayout mDrawerLayout;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);

        NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
        if (navigationView != null) {
            setupDrawerContent(navigationView);
        }
    }

    private void setupDrawerContent(NavigationView navigationView) {
        navigationView.setNavigationItemSelectedListener(
                new NavigationView.OnNavigationItemSelectedListener() {
            @Override
            public boolean onNavigationItemSelected(MenuItem menuItem) {
                mDrawerLayout.closeDrawers();

                return true;
            }
        });
    }
}

drawer_view.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:title="Section">
        <menu>
            <item
                android:id="@+id/navigation_item_1"
                android:icon="@drawable/ic_browncircle"
                android:title="Sub item 1" />
        </menu>
    </item>
</menu>

ป้อนคำอธิบายรูปภาพที่นี่


ของคุณic_browncircleคืออะไร
Ye Lin Aung

@YeLinAung วงกลมสีน้ำตาลเหมือนไอคอนด้านบนถัดจาก 'รายการย่อย 1' แต่ในสีน้ำตาลไม่ใช่สีเทา
MacaronLover

บางทีคุณสามารถลอง.setColorFilter(MY_BROWN_COLOR)ใช้มุมมองนั้นดู?
Ye Lin Aung

โปรดดูคำตอบของฉันด้านล่าง
Ye Lin Aung

คำตอบ:


350

ฉันพบคำตอบได้ที่นี่: https://stackoverflow.com/a/30632980/875249

เพื่อหลีกเลี่ยงการเชื่อมโยงมันตรงไปตรงมาสวย:

    mNavigationView.setItemIconTintList(null);

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

ที่นี่คุณจะได้รับรายละเอียดเกี่ยวกับการสร้างรายการสถานะสี แต่มันก็ค่อนข้างง่ายเช่นกัน: http://developer.android.com/reference/android/content/res/ColorStateList.html

    <selector xmlns:android="http://schemas.android.com/apk/res/android">
        <item android:state_checked="true" android:color="@color/primary" />
        <item android:state_checked="false" android:color="@android:color/white" />
    </selector>

ใช่ฉันทดสอบกับ Nexus 4 ที่ใช้ API 17 ฉันยังทดสอบกับตัวอย่าง Android M ColorStateList ใช้เวลานานและ NavigationView เป็นส่วนหนึ่งของห้องสมุดสนับสนุนดังนั้นฉันจึงไม่เห็นเหตุผลว่าทำไมสิ่งนี้ถึงไม่สามารถใช้งานได้กับ ICS และอาจกลับมาอีก
Chris

11
ทางเลือก XML ใด ๆ สำหรับสิ่งนี้? พยายามapp:itemIconTint="@null"แต่ไม่สำเร็จ
Mangesh

ขอบคุณฉันเริ่มปวดหัวกับปัญหานี้
wax911

4
mNavigationView.setItemIconTintList(null);นี่คือคำตอบที่ฉันค้นหามานาน ...
Jahid

1
คุณใช้ตัวเลือกที่ไหน
John Sardinha

49

ใช้

    mNavigationView.setItemIconTintList(null);

มันถูก. นอกจากนี้หากไอคอนทั้งหมดของคุณอยู่ในชุดรูปแบบสีเดียว (ฉันมีสีขาวทั้งหมด) คุณสามารถติดตั้งผ่านไฟล์ xml - แอพ: itemIconTint = "@ android: color / white"

กรณีของฉัน:

<android.support.design.widget.NavigationView
    android:id="@+id/nav_view"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:layout_gravity="start"
    android:clickable="true"
    app:headerLayout="@layout/nav_header_main"
    app:itemTextColor="@android:color/white"
    app:menu="@menu/activity_main_drawer"
    android:background="@android:color/black"
    app:itemIconTint="@android:color/white"
    />

คุณรู้วิธีแก้ปัญหาอื่น ๆ หรือไม่?
MacaronLover

อันนี้ใช้งานได้ดีmNavigationView.setItemIconTintList(null);ลบไอคอนเริ่มต้นสีจากไอคอนทั้งหมด ตอนนี้ถ้าคุณมีไอคอนเป็นสีแดงมันก็จะกลายเป็นสีแดงไอคอนจะไม่มีการนำไปใช้
Syed Hissaan

5

ฉันลองอะไรที่คล้ายกันในหนึ่งในแอพของฉัน และใช่ปรากฏว่าสีไอคอนไม่เปลี่ยนแปลง แต่ฉันได้พยายามแก้ไขปัญหาอื่นแล้ว นี่คือฉันic_browncircle.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="oval"
    android:tint="@color/brown"
    >
  <size
      android:height="3dp"
      android:width="3dp"
      />
  <solid android:color="@color/brown"/>
</shape>

ซึ่งฉันเชื่อว่าเป็นสิ่งที่คล้ายกับคุณ แต่ไม่มีผลใด ๆ และไม่เปลี่ยนสี

ดังนั้นสิ่งที่ฉันทำคือ

navigationView.getMenu()
    .findItem(R.id. navigation_item_1)
    .getIcon()
    .setColorFilter(Color.parseColor("#b69260"), PorterDuff.Mode.SRC_ATOP);

และดูเหมือนว่าจะทำงาน นี่คือผลลัพธ์

ป้อนคำอธิบายรูปภาพที่นี่


แล้ว pre-Lollipop ล่ะ?
MacaronLover

ฉันได้ลองวิธีแก้ปัญหาหลายอย่างสำหรับ pre-Lollipop แล้ว จนถึงตอนนี้ยังไม่มีโชค :(
Ye Lin Aung

4

หากคุณสร้างโครงการที่มีลิ้นชักนำทางซึ่งมีAndroid Studioให้ ในชั้นเรียนกิจกรรมหลักของคุณคุณเพียงแค่เพิ่มบรรทัดของรหัสนี้navigationView.setItemIconTintList(null);ให้กับonCreateวิธีการของคุณ แบบนี้;

 NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
 navigationView.setNavigationItemSelectedListener(this);
 navigationView.setItemIconTintList(null); // <----- HERE
 setupDrawerContent(navigationView);

3

คุณสามารถลองใช้ drawable ที่มีสีอ่อนไม่แน่ใจว่าทำงานได้ต่ำกว่า 5.0 หรือไม่

สร้าง drawable และเพิ่มรหัสต่อไปนี้

<?xml version="1.0" encoding="utf-8"?>
<bitmap
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:src="@drawable/ic_browncircle"
    android:tint="@color/brownColor"/>

จากนั้นเปลี่ยนรายการเมนูของคุณที่สามารถสร้างได้ให้เป็นสิ่งที่คุณเพิ่งสร้างขึ้น หากวิธีนี้ใช้ไม่ได้ผลฉันไม่แน่ใจเกี่ยวกับวิธีแก้ไขปัญหาอื่น ๆ คุณสามารถลองใช้ห้องสมุดนี้: https://github.com/mikepenz/MaterialDrawerฉันใช้มันเป็นจำนวนมากในโครงการของฉัน


วิธีนี้ใช้ไม่ได้กับ API 17 (4.2) เหตุผล (อย่างน้อยในประสบการณ์ของฉัน) ก็คือลิ้นชักการนำทางจะซ้อนทับไอคอนสีขาวโดยอัตโนมัติด้วยโทนสีดำเมื่อคุณตั้งค่าธีมของคุณเป็นแสงสว่าง เมื่อฉันลบแสงออกจากธีมไอคอนของฉันกลับเป็นสีขาวเหมือนที่ฉันตั้งใจให้เป็น
Chris


1

บางวิธีรหัสนี้ไม่ทำงาน MainActivity.java

                NavigationView.setItemIconTintList(null); // not working

เพื่อให้คุณสามารถใช้งานได้

MainActivity.java

 NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
   navigationView.setNavigationItemSelectedListener(this); 
   navigationView.setItemIconTintList(null); // <-- HERE add this code for icon color

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