it-swarm.dev

كيف أغلق SearchView برمجياً؟

لدي حاليًا SearchView في شريط الإجراءات في تطبيقي. عندما أنقر على أيقونة البحث ، يتمدد SearchView وستظهر لوحة المفاتيح كما هو متوقع. يؤدي النقر فوق "X" في مربع SearchView إلى إغلاق SearchView كما هو متوقع. ومع ذلك ، عند تنشيط SearchView والضغط على الزر "رجوع" ، يتم إنهاء تطبيقي. هذا هو السلوك الصحيح ، لكن ما أحاول القيام به الآن هو التقاط زر الضغط مرة أخرى وإغلاقه SearchView (وليس تطبيقي) عندما يكون SearchView مرئيًا. هل هناك طريقة لاستدعاء SearchViewOnCloseListener() برمجياً على زر الرجوع؟ على سبيل المثال ، شيء مثل هذا:

// On a back button press, if we are currently searching,
// close the SearchView. Otherwise, invoke normal back button
// behavior.
public boolean onKeyDown(int keyCode, KeyEvent event) {
   if (keyCode == KeyEvent.KEYCODE_BACK) {
        if (isSearchViewVisible) {
            SearchView searchView = (SearchView) menu.findItem(R.id.searchBox)
               .getActionView();

            // This method does not exist
            searchView.invokeClose();
            return true;
        }
    }
    return super.onKeyDown(keyCode, event);
}
61
Tim

بناءً على إجابةMarcinOrlowski ، يمكنك أيضًا استخدام:

@Override
public void onBackPressed() {
    if (!searchView.isIconified()) {
        searchView.setIconified(true);
    } else {
        super.onBackPressed();
    }
}
137
Mohsen Afshin

استعمال

searchView.setIconified(true)

لقد استخدمت أيضًا MenuItemCompat.collapseActionView

MenuItemCompat.collapseActionView(menuItem)
48
betorcs

هناك طريقة بسيطة للقيام بذلك:

@Override
public void onBackPressed() {
    if (!searchView.isIconified()) {
        searchView.onActionViewCollapsed();
    } else {
        super.onBackPressed();
    }
}

او استعمل:

@Override
public void onBackPressed() {
    searchView.onActionViewCollapsed();
    super.onBackPressed();
}

هذا سيجعل عملية البحث في الانهيار قبل الضغط على الظهر ثم سيتم استدعاء الإجراء الخلفي.

كلا الحلول سوف تعمل.

31
blueware

هذا هو الشيء الوحيد الذي يفعل ذلك بالنسبة لي:

  toolbar.collapseActionView();
27
raklos

لاعتراض تخطي زر BACK onBackPressed() ( راجع المستندات )

@Override
public void onBackPressed() {

    if (isSearchViewVisible) {
        SearchView searchView = (SearchView) menu.findItem(R.id.searchBox)
           .getActionView();

        // This method does not exist
        searchView.invokeClose();
    } else {
        super.onBackPressed();
    }
}

EDIT:

يقول محرر المستندات :

إذا لزم الأمر ، يمكنك توسيع أو طي طريقة عرض الإجراء في التعليمات البرمجية الخاصة بك عن طريق استدعاء expandActionView () و collapseActionView () في MenuItem.

22
Marcin Orlowski

إذا كان لديك إدخال على searchView الخاص بك

mSearchView.setIconified(true);

سوف يمسح النص فقط.

الطريقة الصحيحة لإغلاق searchView هي

mSearchView.onActionViewCollapsed();
13
DoruChidean

استعمال:

searchView.setIconified(true);
2
Alex

أفضل !searchView.isIconified() over if(isSearchViewVisible) داخل طريقة onBackPressed() لأن الخيار 2 لا يعمل عندما يكون لديك شظايا مضافة في fragmentmanager'sbackstack التي ترغب في إظهارها عند الضغط على زر الرجوع.

2
Codedroid

لا حاجة لاستخدام طريقة onBackPressed() لهذا !! لقد وجدت الحل ، افعل ما ذكرته أدناه فقط بحيث يتعامل SearchView نفسه مع on button back press event.

داخل طريقة onCreateOptionsMenu() ،

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    MenuItem menuItem = menu.findItem(R.id.action_search);
    SearchView searchview = (SearchView) menuItem.getActionView();
    searchview.setIconifiedByDefault(true);
    searchview.setQueryHint("Enter your keyword");
    searchview.setOnQueryTextListener(this); 
    super.onCreateOptionsMenu(menu, inflater);
}

في menu.xml add showAsAction السمة وتعيين قيمها كـ "always|collapseActionView"

<item
    Android:id="@+id/action_search_item"
    Android:title="Search"
    Android:icon="@drawable/ic_search_logo"
    app:showAsAction="always|collapseActionView"
    app:actionViewClass="Android.support.v7.widget.SearchView"/>

وكنت على استعداد للذهاب ؛)

P.S. - كنت أبحث عن حل منذ وقت طويل ، والآن وجدت الحل ، آمل أن يساعدك جميعًا.

0
codervishal

كما يمكنك استخدام collapseActionView. انها تتعامل تلقائيا مع زر العودة ، انهيار SearchView

<item
      Android:id="@+id/action_search"
      Android:icon="@drawable/ic_magnify"
      Android:title="@string/action_title_search"
      app:actionViewClass="Android.support.v7.widget.SearchView"
      app:showAsAction="ifRoom|collapseActionView" />
0
Deni Erdyneev

إذا كنت لا تستخدم أي وظيفة في طريقة onBackPressed() ، فقم بإزالتها من Activity.So بحيث يتعامل SearchView نفسه مع الحدث onBackPress.

أنا أستخدم SearchView كما

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    MenuItem searchItem = menu.findItem(R.id.action_search);
    SearchView searchview = (SearchView) MenuItemCompat.getActionView(searchItem);
    searchview.setIconifiedByDefault(true);
    searchview.setOnQueryTextListener(this);
    searchview.setSubmitButtonEnabled(true);  
    searchview.setQueryHint("Search Here"); 
    super.onCreateOptionsMenu(menu, inflater);
}

و menu.xml بلدي على النحو التالي

<item
    Android:id="@+id/action_search"
    Android:icon="@drawable/search_tool"
    Android:orderInCategory="1"
    Android:title="Search" 
    app:actionViewClass="Android.support.v7.widget.SearchView"
    app:showAsAction="always|collapseActionView"/>
0
SachinS

طريقى:

  1. إنشاء فئة CustomSearchView
 
 الطبقة العامة CustomSearchView يمتد SearchView {
 العام CustomSearchView (سياق السياق النهائي) {
 super (السياق) ؛ 
 this.setIconifiedByDefault (true) ؛ 
} 
 
Override 
 العام المنطقي dispatchKeyEventPreIme (حدث KeyEvent) {
 if (event.getKeyCode () == KeyEvent.KEYCODE_BACK && 
 event.getAction () == KeyEvent.ACTION_UP) {
 this.onActionViewCollapsed () ؛ 
} 
 إرجاع super.dispatchKeyEventPreIme (حدث) ؛ 
} 
} 
 
  1. إضافة actionViewClass
 <item 
 Android: id = "@ + id/menu_search" 
 Android: title = "@ string/menu_search" 
 Android: icon = "@ drawable /ic_search" Budap.____.] Android: showAsAction = "collapseActionView | ifRoom" 
 Android: actionViewClass = "com.myapp.CustomSearchView" /> Budap.____.]
  1. إنشاء CustomSearchView في onCreateOptionsMenu
 CustomSearchView searchView = (CustomSearchView) menu.findItem (R.id.menu_search) .getActionView ()؛ 
0
Sergei K