崩溃后,SearchView从工具栏中消失

时间:2017-02-08 07:05:20

标签: android searchview

我创建一个小例子来展示我的问题。 使用工具栏中的SearchView和3个按钮的主要布局: 1)设置文本 - 展开搜索视图并设置查询 2)展开 - 展开搜索视图 3)折叠 - 折叠搜索视图

activity_main.xml中     
             机器人:fitsSystemWindows ="真">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fitsSystemWindows="true"
        android:orientation="vertical"
        tools:context="com.porn.MainActivity">

        <android.support.design.widget.AppBarLayout 
            android:layout_width="368dp"
            android:layout_height="wrap_content"
            tools:layout_editor_absoluteX="8dp"
            tools:layout_editor_absoluteY="0dp">

            <android.support.v7.widget.Toolbar
                android:id="@+id/toolbar"
                android:layout_width="match_parent"
                android:layout_height="?attr/actionBarSize"
                android:background="?attr/colorPrimary"
                app:contentInsetStartWithNavigation="0dp">

            </android.support.v7.widget.Toolbar>

        </android.support.design.widget.AppBarLayout>

        <Button
            android:id="@+id/setTextBtn"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Set text" />

        <Button
            android:id="@+id/expandBtn"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Expand" />

        <Button
            android:id="@+id/collapseBtn"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Collapse" />
    </LinearLayout>      
</android.support.v4.widget.DrawerLayout>

MainActivity.java

public class MainActivity extends AppCompatActivity {
    private MenuItem toolbarSearchMenuItem;
    private SearchView toolbarSearchView;

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

        //Toolbar
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        getSupportActionBar().setDisplayShowTitleEnabled(false);
        findViewById(R.id.expandBtn).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                toolbarSearchMenuItem.expandActionView();
            }
        });


        findViewById(R.id.collapseBtn).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                toolbarSearchMenuItem.collapseActionView();
            }
        });

        findViewById(R.id.setTextBtn).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                setToolbarSearchQuery("Text2");
            }
        });
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.toobar, menu);
        toolbarSearchMenuItem = menu.findItem(R.id.toolbar_action_search);
        toolbarSearchView = (SearchView) menu.findItem(R.id.toolbar_action_search).getActionView();
        init();
        return true;
    }

    public void init() {
        //In real app i get searchQuery from extra    
        //String searchQuery = getIntent().getStringExtra(INTENT_EXTRA_SEARCH_QUERY_KEY);
        setToolbarSearchQuery("Text from intent");
    }

    private void setToolbarSearchQuery(String searchQuery) {
        if (!searchQuery.equals("")) {
            toolbarSearchMenuItem.expandActionView();
            toolbarSearchView.setQuery(searchQuery, false);
            toolbarSearchView.clearFocus();
        } else {
            toolbarSearchMenuItem.collapseActionView();
        }
    }

}

当我从onCreateOptionsMenu调用方法init()时出现我的问题(在真实的应用程序中我使用来自intent extra的文本初始化SearchView)。如果我从init调用setToolbarSearchQuery方法,然后单击折叠按钮后SearchView折叠并且搜索图标消失。

但是如果我不调用init方法并且将使用set text按钮调用相同的方法setToolbarSearchQuery它可以正常工作(SearchView折叠并且工具栏中显示搜索图标)。

我如何解决这个问题?为什么图标在崩溃后会消失?

我明白当我从onCreateOptionsMenu扩展SearchView时会发生这种情况。但我怎么能从intent extra更正init SearchView?

截图崩溃后的样子 enter image description here

截图崩溃后必须查看的内容 enter image description here

2 个答案:

答案 0 :(得分:0)

我发现只有一个解决方案。在init方法中设置文本延迟。

public void init() {
    //setToolbarSearchQuery("Text from intent");
    final Handler handler = new Handler();
    handler.postDelayed(new Runnable() {
        @Override
        public void run() {
            toolbarSearchMenuItem.expandActionView();
            toolbarSearchView.setQuery("Text from intent", false);
        }
    }, 1000);
}

但我不喜欢这个解决方案。它看起来像诡计。

答案 1 :(得分:0)

&#34; anton111111&#34;答案效果很好,但对于那些不想使用延迟的人,我建议更改搜索菜单项showAsAction属性如下:

android:showAsAction="always|collapseActionView"

而不是

android:showAsAction="ifRoom|collapseActionView"

请参阅原始答案here