2017-08-20 59 views
0

我在我的android應用程序中創建了一個抽屜開關。它顯示在屏幕的左上角。當我點擊切換時,列表視圖項目將顯示在左側。 屏幕下方是主屏幕:如何更改Android應用上的抽屜切換圖標?

enter image description here

當我點擊切換按鈕,將顯示如下:

enter image description here

現在我想改變的切換按鈕的圖標通過以下代碼:

mDrawerToggle.setHomeAsUpIndicator(R.drawable.ic_drawer); 
mDrawerToggle.setDrawerIndicatorEnabled(false); 

切換圖標更改爲我的drawable,但列表視圖項目w當我點擊切換按鈕時不會顯示。我想知道爲什麼更改切換圖標會禁用切換點擊。

下面是我的活動類:

public class MainActivity extends AppCompatActivity { 
    private DrawerLayout mDrawerLayout; 
    private ListView mDrawerList; 
    private ActionBarDrawerToggle mDrawerToggle; 
    private String[] mPlanetTitles; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.activity_main); 
     getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
     getSupportActionBar().setHomeButtonEnabled(true); 
     getSupportActionBar().setDisplayShowTitleEnabled(false); 

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

     mDrawerList = (ListView) findViewById(R.id.left_drawer); 
     mPlanetTitles = getResources().getStringArray(R.array.planets_array); 
     // Set the adapter for the list view 
     mDrawerList.setAdapter(new ArrayAdapter<String>(this, 
       R.layout.drawer_list_item, mPlanetTitles)); 
     mDrawerList.setOnItemClickListener(new DrawerItemClickListener()); 

     mDrawerToggle = new ActionBarDrawerToggle(
       this,     /* host Activity */ 
       mDrawerLayout, 
       R.string.drawer_open, /* "open drawer" description for accessibility */ 
       R.string.drawer_close /* "close drawer" description for accessibility */ 
     ) { 
      public void onDrawerClosed(View view) { 
       invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu() 
      } 

      public void onDrawerOpened(View drawerView) { 
       invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu() 
      } 
     }; 
     mDrawerToggle.setHomeAsUpIndicator(R.drawable.ic_drawer); 
//  mDrawerToggle.setDrawerIndicatorEnabled(false); 
     mDrawerLayout.addDrawerListener(mDrawerToggle); 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     if(mDrawerToggle.onOptionsItemSelected(item)) { 
      return true; 
     } 
     return super.onOptionsItemSelected(item); 
    } 

    @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); 
     // Pass any configuration change to the drawer toggls 
     mDrawerToggle.onConfigurationChanged(newConfig); 
    } 


    /* The click listner for ListView in the navigation drawer */ 
    private class DrawerItemClickListener implements ListView.OnItemClickListener { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
     } 
    } 
} 
+0

「我不知道爲什麼改變切換圖標禁用切換點擊。」 - 他們就是這麼設計的。如果你不想要漢堡包圖標,那麼不要使用'ActionBarDrawerToggle'。用'getSupportActionBar()。setHomeAsUpIndicator()'設置你的圖標,並且在'onOptionsItemSelected()'中處理打開/關閉抽屜的方式if'item.getItemId()== android.R.id.home'。 –

回答

0

的V7 ActionBarDrawerToggle真的只能做兩件事情:打開/關閉抽屜,它提供的漢堡包圖標和動畫。撥打setDrawerIndicatorEnabled(false)將刪除其圖標,但也會禁用切換。如果你不想要那個圖標,那麼你最好不要使用ActionBarDrawerToggle,並且自己處理打開/關閉抽屜。

  • 首先,刪除您所有的代碼爲ActionBarDrawerToggle
  • 然後用getSupportActionBar().setHomeAsUpIndicator()設置你想要的圖標。
  • onOptionsItemSelected()中,如果MenuItem的ID爲android.R.id.home,請根據需要打開或關閉抽屜。
  • 最後,ActionBarDrawerToggleDrawerLayout.DrawerListener功能可以替換爲基本的SimpleDrawerListener

public class MainActivity extends AppCompatActivity { 
    private DrawerLayout mDrawerLayout; 
    private ListView mDrawerList; 
    private String[] mPlanetTitles; 

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

     getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
     getSupportActionBar().setDisplayShowTitleEnabled(false); 

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

     mDrawerList = (ListView) findViewById(R.id.left_drawer); 
     mPlanetTitles = getResources().getStringArray(R.array.planets_array); 
     // Set the adapter for the list view 
     mDrawerList.setAdapter(new ArrayAdapter<String>(this, 
      R.layout.drawer_list_item, mPlanetTitles)); 
     mDrawerList.setOnItemClickListener(new DrawerItemClickListener()); 

     // *** Set your desired icon 
     getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_drawer); 

     // *** Replace the DrawerListener functionality of the ActionBarDrawerToggle 
     mDrawerLayout.addDrawerListener(new DrawerLayout.SimpleDrawerListener() { 
       @Override 
       public void onDrawerClosed(View view) { 
        invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu() 
       } 

       @Override 
       public void onDrawerOpened(View drawerView) { 
        invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu() 
       } 
      } 
     ); 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // *** If the home button is clicked, open/close the drawer as needed 
     if (item.getItemId() == android.R.id.home) { 
      if (mDrawerLayout.isDrawerOpen(GravityCompat.START)) { 
       mDrawerLayout.closeDrawer(GravityCompat.START); 
      } 
      else { 
       mDrawerLayout.openDrawer(GravityCompat.START); 
      } 

      return true; 
     } 

     return super.onOptionsItemSelected(item); 
    } 

    @Override 
    protected void onPostCreate(Bundle savedInstanceState) { 
     super.onPostCreate(savedInstanceState); 
    } 

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

    /* The click listner for ListView in the navigation drawer */ 
    private class DrawerItemClickListener implements ListView.OnItemClickListener { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
     } 
    } 
} 
0

使用syncState()改變切換按鈕的圖標後。

mDrawerToggle.setHomeAsUpIndicator(R.drawable.ic_drawer); 
mDrawerToggle.setDrawerIndicatorEnabled(false); 
mDrawerToggle.syncState(); 
+1

添加此代碼後,圖標可以更改,但點擊該圖標不會使左側的listview項目顯示。我看到邁克回答我的問題,說'ActionBarDrawerToggle'不支持更改圖標。可能是我需要一個不同的方法 –

+1

@ ZhaoYi'ActionBarDrawerToggle'確實允許你在一定程度上改變圖標。但是,您設置的圖標必須是'DrawerArrowDrawable'子類,可能不是您想要的。如果您仍然需要解決方案,我可以在上面的評論中發佈一個我在上面評論中提出的示例。 –

+1

@MikeM。演示代碼真的很有用。如果你覺得不難,請發表一個例子。謝謝。 –

相關問題