簡體   English   中英

在menu.xml中定義的可繪制矢量圖標未顯示在appBar中?

[英]Drawable Vector Icon defined in menu.xml doesn't show up in appBar?

menu.xml中的可繪制矢量圖標未顯示在appBar中,其中有兩個,一個是搜索Icon,另一個是過濾器Icon。 我不知道哪里出了錯。 這是我的活動的摘要:

static String query;
static {
    AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
}
Toolbar myToolbar;
SearchView searchView = null;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_search);
    //Set custom AppBar
    myToolbar = findViewById(R.id.search_toolbar);
    //myToolbar.inflateMenu(R.menu.menu_search);
    initToolBarMenuIcons();
    setSupportActionBar(myToolbar);

    myToolbar.setOnMenuItemClickListener(this);
    setupViews();

    //Check internet connection
    new InternetCheck(internet -> {
        //Display no internet Toast if there's no internet
        if (!internet) {
            Toast.makeText(this, "no internet", Toast.LENGTH_SHORT).show();
        }
    });
}

@MainThread
@SuppressLint("NewApi") //suppress warning, since using DrawableCompat to set tint
public void initToolBarMenuIcons() {
    myToolbar.inflateMenu(R.menu.menu_search);
    //Manually adding icon since it's a vector drawable and we can't currently inflate from XML into menuitems
    Drawable wrappedFilterIcon = DrawableCompat
            .wrap(Objects.requireNonNull(AppCompatResources
                    .getDrawable(getBaseContext(), R.drawable.ic_filter_list_white_24dp)));
    Drawable wrappedSearchIcon = DrawableCompat
            .wrap(Objects.requireNonNull(AppCompatResources
                    .getDrawable(getBaseContext(), R.drawable.ic_search_white_24dp)));
    //Tint it too
    DrawableCompat.setTint(wrappedFilterIcon, Color.WHITE);
    DrawableCompat.setTint(wrappedSearchIcon, Color.WHITE);
    //Set the tinted vector drawable to the item
    myToolbar.getMenu().findItem(R.id.action_filter).setIcon(wrappedFilterIcon);
    myToolbar.getMenu().findItem(R.id.action_search).setIcon(wrappedSearchIcon);
}
[snip...]

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is  present.
    getMenuInflater().inflate(R.menu.menu_search, menu);
    MenuItem searchItem = menu.findItem(R.id.action_search);
    searchView = (SearchView) searchItem.getActionView();
    searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
        @Override
        public boolean onQueryTextSubmit(String query) {
            onArticleSearch(null);
            searchView.clearFocus();
            return true;
        }

        @Override
        public boolean onQueryTextChange(String newText) {
            return false;
        }
    });
    return super.onCreateOptionsMenu(menu);
}

這是在menu.xml中指定項目和圖標來源的位置。 我使用app:srcCompat作為圖標路徑。

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:tools="http://schemas.android.com/tools"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
    android:id="@+id/action_filter"
    app:showAsAction="always"
    app:srcCompat="@drawable/ic_filter_list_white_24dp"
    tools:ignore="MenuTitle"
    android:orderInCategory="2" />

<item android:id="@+id/action_search"
    android:orderInCategory="1"
    android:title="Search Article"
    app:srcCompat="@drawable/ic_search_white_24dp"
    app:showAsAction="always|collapseActionView"
    app:actionViewClass="android.support.v7.widget.SearchView" />

我導入了以下庫:實現“ com.android.support:support-vector-drawable:27.1.1”實現“ com.android.support:animated-vector-drawable:27.1.1”

然后在我的應用Gradle文件中進行設置:

android {
compileSdkVersion 27
defaultConfig {
    applicationId "com.realty.drake.newyorktimessearcher"
    minSdkVersion 16
    targetSdkVersion 27
    versionCode 1
    versionName "1.0"
    testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    vectorDrawables.useSupportLibrary true
}

請幫我

好像我不明白你的問題。 嘗試將drawable設置為菜單,如下所示:

  <item
        android:id="@+id/menuItem"
        android:icon="@drawable/yourdrawable"
        />

抱歉,下面的文字是關於在菜單中使用animateddrawable的。

具有矢量動畫的文件實現了Animatable接口,並且要啟動動畫,您需要請求Drawable,將其帶到Animatable並調用start()方法。 我在onOptionsItemSelected中做到這一點:

  override fun onOptionsItemSelected(item: MenuItem?): Boolean {
        when (item?.itemId) {
           ..........
            R.id.editNotification -> {
                (item.icon as Animatable).start()
            }
        }
        return super.onOptionsItemSelected(item)
    } 

對於Java使用:

((Animatable) item.getIcon()).start();

但是您可能會遇到我遇到的一個問題:如何向后動畫。 我沒有本機解決方案,但是您可以這樣操作:1.使用向后動畫創建可繪制對象2.實施AnimationCallback並在動畫結束時切換這些可繪制對象。 例如:

override fun onCreateOptionsMenu(menu: Menu?): Boolean {
        menuInflater.inflate(R.menu.menu_edit_notification, menu)
        animDrawable = AnimatedVectorDrawableCompat.create(this, R.drawable.avd_edit_to_close)!!
        menu?.getItem(0)?.icon = animDrawable
        return true
    }

    override fun onOptionsItemSelected(item: MenuItem?): Boolean {
        when (item?.itemId) {
           ..............................
            R.id.editNotification -> {
                animDrawable.registerAnimationCallback(object : Animatable2Compat.AnimationCallback() {
                    override fun onAnimationEnd(drawable: Drawable?) {
                        animDrawable = AnimatedVectorDrawableCompat.create(this@NotificationActivity, if (inEditMode) R.drawable.avd_edit_to_close else R.drawable.avd_close_to_edit)!!
                        inEditMode = !inEditMode
                        item.icon = animDrawable
                    }
                })
                animDrawable.start()
            }
        }
        return super.onOptionsItemSelected(item)
    }

其中:animDrawable-是AnimatedVectorDrawableCompat inEditMode的實例-只是我的布爾標志抱歉,但是現在我沒有時間用Java編寫它,但是可以自由地提問

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM