menu如果设置了actionLayout,则不显示项目

时间:2018-04-02 18:33:09

标签: android android-actionbar badge

我试图使用"徽章"对于我的actionBar上的一个项目,类似这样但没有数字:enter image description here

问题是,每当我设置app:actionLayout="@layout/actionbar_badge_layout"时,我的同步项目都没有显示(但徽章确实存在)。我使用此代码:

badge_noty.xml

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

    <solid android:color="@color/colorRed"/>
    <stroke android:color="@android:color/white" android:width="1dp"/>

</shape>

actionbar_sync.xml

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

    <item
        android:id="@+id/action_sync"
        android:icon="@drawable/ic_sync"
        android:title="Sync"
        app:actionLayout="@layout/actionbar_badge_layout"
        app:showAsAction="always"
   />
</menu>

actionbar_badge_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    style="?attr/actionButtonStyle"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:clipToPadding="false"
    android:focusable="true"
    >

    <!-- Badge -->
    <ImageView
        android:id="@+id/img_badge_sync"
        android:layout_width="12dp"
        android:layout_height="12dp"
        android:src="@drawable/badge_noty" />

</FrameLayout>

MainActivity.java

public class MainActivity extends AppCompatActivity
        implements NavigationView.OnNavigationItemSelectedListener {

    private ImageView syncBadge;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        ...............
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.actionbar_sync, menu);

        final MenuItem syncItem = menu.findItem(R.id.action_sync);
        View actionView = syncItem.getActionView();
        syncBadge = actionView.findViewById(R.id.img_badge_sync);

        return true;
    }

为什么我的同步图标没有显示?

编辑1: 我尝试了 Imtiaz Abir 回答,但它确实有效,但并不像预期的那样。现在,单击同步项时未触发onOptionsItemSelected。所以,我认为 Imtiaz Abir 答案不是正确的解决方案

1 个答案:

答案 0 :(得分:0)

由于您已在 actionbar_sync.xml 菜单文件的菜单项中定义了 app:actionLayout ,因此默认 android:icon 属性不会工作。因此,解决方案是在 actionbar_badge_layout.xml 文件中使用ImageView添加同步图标以及带有徽章的ImageView,并从菜单项中删除 android:icon 属性。

<强> actionbar_sync.xml

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

    <item
        android:id="@+id/action_sync"
        android:title="Sync"
        app:actionLayout="@layout/actionbar_badge_layout"
        app:showAsAction="always"
   />
</menu>

<强> actionbar_sync.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    style="?attr/actionButtonStyle"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:clipToPadding="false"
    android:focusable="true"
    >

    <!-- Badge -->
    <ImageView
        android:id="@+id/img_badge_sync"
        android:layout_width="12dp"
        android:layout_height="12dp"
        android:src="@drawable/badge_noty" />

     <!-- Sync image -->
     <ImageView
        android:id="@+id/icon_sync"
        android:layout_width="32dp"
        android:layout_height="32dp"
        android:src="@drawable/ic_sync" />

</FrameLayout>