2012-12-02 11 views
6

Używam ActionBarSherlock:pozycje menu Schowaj kiedy ActionLayout jest otwarty

Istnieją 3 pozycje menu, z których tylko 1 ma ActionLayout.

default_menu.xml

<item 
    android:id="@+id/searchIcon" 
    android:icon="@drawable/search_icon" 
    android:actionLayout="@layout/search_icon_actionview" 
    android:showAsAction="always|collapseActionView" 
    android:title="Search"/> 
<item 
    android:id="@+id/newIcon" 
    android:icon="@drawable/new_icon" 
    android:orderInCategory="0" 
    android:showAsAction="ifRoom|collapseActionView" 
    android:title="New"/> 
<item 
    android:id="@+id/notificationIcon" 
    android:icon="@drawable/notification_icon" 
    android:orderInCategory="0" 
    android:showAsAction="ifRoom|collapseActionView" 
    android:title="Notifications"/> 

jeśli używam powyższy kod. Widoczne są tylko pierwsze 2 ikony. A jeśli zrobię 2. i 3. jako Zawsze pozostają one nawet po otwarciu actionLayout po kliknięciu na Wyszukaj.

Chcę pokazać wszystkie 3 pozycje menu, a po kliknięciu search_icon ukryć każdy element.

Mam również wątpliwości co do mojej implementacji, czy robię to we właściwy sposób.

w działalności (która ma viewPager) pierwszy fragment:

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 

    case R.id.searchIcon: 

    mEtSearchbar.clearFocus(); 
    (new Handler()).postDelayed(new Runnable() { 
     public void run() { 
      mEtSearchbar.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN, 0, 0, 0)); 
      mEtSearchbar.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_UP , 0, 0, 0)); 
     } 
    }, 100); 

     return true; 
    case R.id.newIcon: 

     return true; 
    case R.id.notificationIcon: 

     return true; 
    default: 
     return super.onOptionsItemSelected(item); 
    } 
} 

@Override 
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
    // TODO Auto-generated method stub 
    inflater.inflate(R.menu.default_menu, menu); 

    mSearchbar = (MenuItem) menu.findItem(R.id.searchIcon); 
    View actionview = mSearchbar.getActionView(); 
    mEtSearchbar = ((EditText) actionview.findViewById(R.id.search_editText)); 
    ImageView searchImage = ((ImageView) actionview.findViewById(R.id.search_image)); 
    searchImage.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View arg0) { 

      String s = mEtSearchbar.getText().toString(); 
      Toast.makeText(getSherlockActivity(), "Searching for: " + s, Toast.LENGTH_SHORT) 
        .show(); 
     } 
    }); 
    super.onCreateOptionsMenu(menu, inflater); 
} 
+0

Czy znaleźć rozwiązanie? – Giuseppe

+0

@Giuseppe Tak. Sprawdź moją odpowiedź poniżej i zapytaj, czy chcesz, abym dodał coś jeszcze. –

Odpowiedz

7

Oto czego użyłem.

@Override 
    public boolean onCreateOptionsMenu(Menu menu) { 

      super.onCreateOptionsMenu(menu); 
      MenuInflater inflater = getSupportMenuInflater(); 
      inflater.inflate(R.menu.main, menu); 

      MenuItem searchItem = menu.findItem(R.id.search); 

      mSearchView = (SearchView) searchItem.getActionView(); 
      setupSearchView(searchItem); 

      mSearchView.setOnSearchClickListener(new View.OnClickListener() { 
        @Override 
        public void onClick(View v) { 
          // hide action item 
          if (menu != null) { 
            menu.findItem(R.id.notifications).setVisible(false); 
            menu.findItem(R.id.share).setVisible(false); 
          } 

        } 
      }); 
      mSearchView.setOnCloseListener(new SearchView.OnCloseListener() { 
        @Override 
        public boolean onClose() { 
          adapter.getFilter().filter(""); 
          // re-show the action button 
          if (menu != null) { 
            menu.findItem(R.id.notifications).setVisible(true); 
            menu.findItem(R.id.share).setVisible(true); 
          } 
          return false; 

        } 
      }); 
      return true; 
    } 

private void setupSearchView(MenuItem searchItem) { 
     //code 
} 
+0

Dzięki za to, już wypróbowałem to, ale niestety setOnCloseListener() nie działa! Nic nie robi, nie wchodzi w onClose(), westchnienie. Być może jest to błąd w pasku akcji akcji? – Giuseppe

+0

Zdecydowanie nie, ponieważ działa dla mnie –

+0

Czy używasz actionbarshelock 4.2.0, czy to prawda? – Giuseppe

1

Nie jestem pewien, ale spróbuj ten jeden raz.

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
getSupportMenuInflater().inflate(R.menu.map_menu, menu); 
for (int i = 0; i < menu.size(); i++) { 
    MenuItem item = menu.getItem(i); 
    if (item.getItemId() == R.id.menu_more) { 
     itemChooser = item.getActionView(); 
     if (itemChooser != null) { 
      itemChooser.setOnClickListener(this); 
     } 
    } 
} 
return super.onCreateOptionsMenu(menu); 
} 
2

Myślę, że można ustawić coś takiego na searchView:

searchCommand.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM | MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW); 
+1

To jest jedyna poprawna odpowiedź. Wszystkie inne odpowiedzi wymyślają koło. – Mariusz

+0

Dzięki. Działa dla mnie –

Powiązane problemy