2017-08-20 55 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。演示代码真的很有用。如果你觉得不难,请发表一个例子。谢谢。 –

相关问题