搜索视图中是否存在“ app:showAsAction =“ifRoom | collapseActionView””的错误?

3
  1. MenuItem使用SearchView展开后,溢出菜单会显示另一个搜索项。我期望的行为是,在SearchView展开时不会显示另一个搜索项。
  2. MenuItem折叠后,搜索项不再存在。我期望的行为是它会折叠回图标。

第一种状态: 第一种状态
第二种状态: 第二种状态
第三种状态: 第三种状态
第四种状态: 第四种状态

我的当前解决方案是将app:showAsAction="ifRoom|collapseActionView"更改为app:showAsAction="always|collapseActionView",一切都可以正常工作。

layout\main.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <androidx.appcompat.widget.Toolbar android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="?attr/colorPrimary"
        android:minHeight="?attr/actionBarSize"
        android:theme="?attr/actionBarTheme"
        app:title="Main" />
</LinearLayout>

menu\main.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/search"
        android:icon="@drawable/ic_search_white"
        android:title="Search"
        app:actionViewClass="android.widget.SearchView"
        app:showAsAction="ifRoom|collapseActionView" />

    <item android:id="@+id/enter_delete_mode"
        android:icon="@drawable/ic_delete_white"
        android:title="Enter delete mode"
        app:showAsAction="never" />
</menu>

MainActivity.java:

import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.MenuItem.OnActionExpandListener;
import android.widget.SearchView;
import android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;

public class MainActivity extends AppCompatActivity implements OnActionExpandListener {
    private SearchView searchView;

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

        Toolbar t = findViewById(R.id.toolbar);
        setSupportActionBar(t);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater mi = getMenuInflater();
        mi.inflate(R.menu.main, menu);

        MenuItem searchItem = menu.findItem(R.id.search);
        searchView = (SearchView) searchItem.getActionView();
        searchView.setIconifiedByDefault(false);
        searchView.setQueryHint("Search...");
        searchItem.setOnActionExpandListener(this);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        if (item.getItemId() == R.id.enter_delete_mode)
            Toast.makeText(this, "Pressed!", Toast.LENGTH_SHORT).show();
        return super.onOptionsItemSelected(item);
    }

    @Override
    public boolean onMenuItemActionExpand(MenuItem item) {
        searchView.setIconified(false);
        return true;
    }

    @Override
    public boolean onMenuItemActionCollapse(MenuItem item) {
        searchView.setIconified(true);
        searchView.clearFocus();
        return true;
    }
}
1个回答

0

对我来说,这似乎是一个 bug,尽管我找不到任何关于它的文章。

然而,我找到了一个解决方法,希望能帮助到某些人。

为了防止 searchView 在展开时被列在溢出菜单下,可以在运行时更改其 ShowAsAction 属性为 SHOW_AS_ACTION_ALWAYS | SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW,当 searchView 状态 展开时执行。

@Override
public boolean onMenuItemActionExpand(MenuItem item) {
  //Force searchItem not to be listed under overflow menu.
    item.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS |
                         MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW);
    return true;
}

为了防止折叠时 searchView 项目消失,只需调用 invalidateOptionsMenu 来重新绘制菜单即可。
@Override
public boolean onMenuItemActionCollapse(MenuItem item) { 
    //Call menu to be redrawn
    invalidateOptionsMenu();
    return true;
}

1
是的,我也找不到任何关于它的资料。甚至在用于提交Android错误报告的网站上也没有。如果他们真的想使用“ifRoom”标志,他们可以使用这个解决方案。 - Harry Loh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接