Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

like image 558
Anton111111 Avatar asked Oct 22 '25 05:10

Anton111111


2 Answers

The "anton111111" answer works perfectly, but just for those who don't want to use delay, I recommend change search menu item showAsAction property as below:

android:showAsAction="always|collapseActionView"

instead of

android:showAsAction="ifRoom|collapseActionView"

See original answer here.

like image 141
Omid Saadat Avatar answered Oct 24 '25 23:10

Omid Saadat


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.

like image 28
Anton111111 Avatar answered Oct 24 '25 23:10

Anton111111



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!