2014-03-24 10 views
5

Ich entwickle gerade und Android-App, die Api10 + unterstützen muss Ich folgte viele Tutorials zu setzen AppCompat zu verwalten, um die Aktionsleiste zu erstellen.Android Appcompat API 10 Einsturz Aktion

Links wie: https://stackoverflow.com/a/21291156/2789106 http://developer.android.com/guide/topics/ui/actionbar.html

Es gibt nur drei Dinge, die ich nicht tun kann.

  1. Wenn die Suche geöffnet wird, ändert sich die Suchlupe NICHT in die von mir festgelegte Zeichenmenge.
  2. Ich kann nicht das „Zurück“ Symbol ändern (die home-Taste, um das Logo links (es ist ein verschiedenes Einrichtungs Bild als das, was ich in der Schaffung der drawerToggle weitergegeben))
  3. kann ich nicht programmatisch nahe (Kollaps) die Aktionsansicht, wenn auf die Tastatursuche geklickt wird. (Aufruf collapseActionView() wurde in API 14 inplemented)

Hier ist mein Code:

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

    // ActionBarDrawerToggle ties together the the proper interactions 
    // between the sliding drawer and the action bar app icon 

    mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); 

    mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, 
      R.drawable.ic_navigation_drawer, 
      R.string.navigation_drawer_open, 
      R.string.navigation_drawer_close) { 

     /** Called when a drawer has settled in a completely closed state. */ 
     public void onDrawerClosed(View view) { 
      supportInvalidateOptionsMenu(); // creates call to onPrepareOptionsMenu() 
     } 

     /** Called when a drawer has settled in a completely open state. */ 
     public void onDrawerOpened(View drawerView) { 
      supportInvalidateOptionsMenu(); // creates call to onPrepareOptionsMenu() 
     } 

    }; 

    // Set the drawer toggle as the DrawerListener 
    mDrawerLayout.setDrawerListener(mDrawerToggle); 

    // Restore app state if any 
    if (savedInstanceState == null) { 
     mLeftMenuContainer = (LinearLayout) findViewById(R.id.left_menu_container); 
     mLeftMenuContainer.setOnTouchListener(new View.OnTouchListener() { 
      @Override 
      public boolean onTouch(View arg0, MotionEvent arg1) { 
       // return TRUE to avoid tap on back view 
       return true; 
      } 

     }); 
     mDrawerLayout.closeDrawer(mLeftMenuContainer); 

    } 

    // enable ActionBar app icon to behave as action to toggle nav drawer 
    getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
    getSupportActionBar().setHomeButtonEnabled(true); 
    getSupportActionBar().setDisplayShowTitleEnabled(true); 
    getSupportActionBar().setLogo(R.drawable.ic_action_bar_logo); 

} 

/* Called whenever we call supportInvalidateOptionsMenu() */ 
@Override 
public boolean onPrepareOptionsMenu(Menu menu) { 
    // If the nav drawer is open, hide action items related to the content 
    // view 
    if (mDrawerLayout != null && mLeftMenuContainer != null) { 
     boolean drawerOpen = mDrawerLayout.isDrawerOpen(mLeftMenuContainer); 
     for (int i = 0; i < menu.size(); i++) { 
      menu.getItem(i).setVisible(!drawerOpen); 
     } 
    } 

    return super.onPrepareOptionsMenu(menu); 
} 

@Override 
protected void onPostCreate(Bundle savedInstanceState) { 
    super.onPostCreate(savedInstanceState); 
    // Sync the toggle state after onRestoreInstanceState has occurred. 
    mDrawerToggle.syncState(); 
} 

@Override 
public void onConfigurationChanged(Configuration newConfig) { 
    super.onConfigurationChanged(newConfig); 
    mDrawerToggle.onConfigurationChanged(newConfig); 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 

    mMenu = menu; 
    // Inflate the menu; this adds items to the action bar if it is present. 
    // enable ActionBar app icon to behave as action to toggle nav drawer 
    getMenuInflater().inflate(R.menu.main, menu); 

    MenuItem searchItem = menu.findItem(R.id.action_bar_search); 
    final SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem); 

    SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); 
    SearchableInfo info = searchManager.getSearchableInfo(getComponentName()); 

    searchView.setSearchableInfo(info); 

    AutoCompleteTextView searchText = (AutoCompleteTextView) searchView.findViewById(android.support.v7.appcompat.R.id.search_src_text); 
    searchText.setHintTextColor(getResources().getColor(R.color.color_action_bar_search_text)); 
    searchText.setTextColor(getResources().getColor(R.color.color_action_bar_search_text)); 

    searchView.setIconifiedByDefault(true); 

    // Getting the 'search_plate' LinearLayout. 
    View searchPlate = searchView.findViewById(android.support.v7.appcompat.R.id.search_plate); 
    // Setting background of 'search_plate' to personal defined drawable. 
    if (searchPlate != null) { 
     searchPlate 
      .setBackgroundResource(R.drawable.texfield_search_view_theme); 
    } 

    // Set search view clear icon 
    ImageView searchIconClearView = (ImageView) searchView 
      .findViewById(android.support.v7.appcompat.R.id.search_close_btn); 
    if (searchIconClearView != null) { 
     Log.v(LOG_TAG, "Should Change Clear Icon here"); 

     searchIconClearView 
      .setImageResource(R.drawable.ic_action_bar_clear_search); 

    } 

    // Set search view Magnifier icon 
    ImageView searchIcon = (ImageView) searchView.findViewById(android.support.v7.appcompat.R.id.search_mag_icon); 
    if (searchIcon != null) { 
     Log.v(LOG_TAG, "Should Change Search Icon here"); 
     searchIcon.setImageResource(R.drawable.ic_action_bar_back); 
    } 

    // Set on click to open a fragment, not a activity 
    final SearchView.OnQueryTextListener queryTextListener = new SearchView.OnQueryTextListener() { 
     @Override 
     public boolean onQueryTextChange(String newText) { 
      // Do something 
      return true; 
     } 

     @Override 
     public boolean onQueryTextSubmit(String query) { 
      Log.v(LOG_TAG, "Performed search with: " + query); 
      searchView.clearFocus(); 
      return true; 
     } 
    }; 

    searchView.setOnQueryTextListener(queryTextListener); 

    MenuItemCompat.setOnActionExpandListener(searchItem, new OnActionExpandListener() { 

     @Override 
     public boolean onMenuItemActionCollapse(MenuItem arg0) { 
      mMenu.findItem(R.id.action_bar_cart).setVisible(true); 
      return true; 
     } 

     @Override 
     public boolean onMenuItemActionExpand(MenuItem arg0) { 
      getSupportActionBar().setIcon(R.drawable.ic_action_bar_logo); 
      mMenu.findItem(R.id.action_bar_cart).setVisible(false); 
      return true; 
     } 


    }); 

    return super.onCreateOptionsMenu(menu); 
} 

Kann mir bitte jemand sagen, ob ich etwas falsch tue?

- EDIT -

ich es geschafft Frage Nummer 1 und 2 zu beheben:

Was Sie tun müssen, ist die homeUpIcon in Ihrem Thema zu definieren. Wenn Sie also unterstützen API 10 wie mich:

<style name="Theme.MyTheme" parent="@style/Theme.AppCompat.Light"> 
    <item name="searchViewSearchIcon">@drawable/your_search_icon</item> 

    <!-- API 13- Support --> 
    <item name="homeAsUpIndicator">@drawable/your_back_icon</item> 

    <!-- API 14+ --> 
    <item name="android:homeAsUpIndicator">@drawable/your_back_icon</item> 

</style> 

in
gefunden ActionBarSherlock: changing homeAsUpIndicator doesn't work
und Changing the background drawable of the searchview widget

Die wichtigste Frage ist noch anhängig, und wenn jemand die Antwort weiß, bitte hier posten!

Antwort

19

Versuchen Sie folgendes:

public boolean onQueryTextSubmit(String query) { 
     MenuItemCompat.collapseActionView(searchItem); 
     return false; 
    } 
+1

ich mit 'App die MenuItem-Setup haben musste: showAsAction = "collapseActionView | immer"', bevor diese funktionieren würde. –