Search code examples
androidsearchview

After collapse SearchView disappear from toolbar


I create small example to show my issue. Main layout with SearchView in toolbar and 3 buttons: 1) Set text - expand search view and set query 2) Expand - expand search view 3) Collapse - collapse search view

activity_main.xml
android:fitsSystemWindows="true">

    <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();
        }
    }

}

My problem appears when i call method init() from onCreateOptionsMenu (In real app i init SearchView with text from intent extra). If i call setToolbarSearchQuery method from init and after i click collapse button SearchView collapsed and search icon disappear.

But if i will not call init method and will call same method setToolbarSearchQuery with set text button it works correctly (SearchView is collapsed and search icon shown in toolbar).

How i can solve this problem? And why icon disappear after collapse?

I understood that it happens when i expand SearchView from onCreateOptionsMenu. But how i can correct init SearchView from intent extra?

Screenshot how it looks after collapse enter image description here

Screenshot how it must looks after collapse enter image description here


Solution

  • I found only one solution. Set text in init method delayed.

    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);
    }
    

    But i don't like this solution. It looks like trick.