2014-10-20 2 views
0

저는 support-lib 액션 바를 가지고 ViewDrawer를 만들려고합니다. 내 레이아웃은Android ViewDrawer 홈 버튼

<?xml version="1.0" encoding="utf-8"?> 
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/drawer_container" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" > 

    <FrameLayout 
     android:id="@+id/content" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" /> 

    <include 
     android:id="@+id/drawer_view" 
     android:layout_width="@dimen/drawer_width" 
     android:layout_height="match_parent" 
     android:layout_gravity="start" 
     layout="@layout/include_drawer" /> 

</android.support.v4.widget.DrawerLayout> 

처럼 보인다 그리고 활동은 다음과 같이 보입니다 :

public abstract class BaseActivity extends BaseSimpleActivity { 
    public static final String FRAGMENT_TAG = "content"; 
    protected DrawerLayout mDrawerLayout; 
    protected ActionBarDrawerToggle mDrawerToggle; 
    protected ListView mDrawerList; 
    protected ViewGroup mDrawerView; 
    protected View mDrawerBtnSettings; 
    private Handler mHandler; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { ... } 



    protected void initViews(String title, Fragment fragment) { 
     setContentView(R.layout.activity_base_secondary); 
     getSupportFragmentManager().beginTransaction().replace(R.id.content, fragment, FRAGMENT_TAG).commit(); 
     initDrawer(); 
     initActionBar(); 
    } 

    protected void setTitle(String title) { 
     super.setTitle(title); 
     getSupportActionBar().setTitle(title); 
    } 

    private void initActionBar() { 
     android.support.v7.app.ActionBar actionBar = getSupportActionBar(); 
     actionBar.setDisplayOptions(ActionBar.DISPLAY_HOME_AS_UP); 
     //actionBar.setIcon(R.drawable.ic_launcher); 
     actionBar.setDisplayShowTitleEnabled(false); 
     actionBar.setDisplayShowCustomEnabled(true); 
     actionBar.setCustomView(R.layout.action_bar); 

     TextView title = (TextView) actionBar.getCustomView().findViewById(R.id.actionBarTitle); 
     title.setText(getTitleResId()); 
     title.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       if (mDrawerLayout.isDrawerOpen(Gravity.START)) { 
        mDrawerLayout.closeDrawers(); 
       } else { 
        mDrawerLayout.openDrawer(Gravity.START); 
       } 
      } 
     }); 
     refreshActionBar(); 
    } 

    public abstract String getTitleResId(); 

    private void initDrawer() { 
     mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_container); 
     mDrawerView = (ViewGroup) findViewById(R.id.drawer_view); 

     mDrawerList = (ListView) findViewById(R.id.drawer_list); 
     mDrawerList.setAdapter(new DrawerListAdapter(this)); 
     mDrawerList.setOnItemClickListener(new DrawerItemClickListener()); 

     mDrawerToggle = createDrawerToggle(); 
     mDrawerLayout.setDrawerListener(mDrawerToggle); 

     mDrawerBtnSettings = findViewById(R.id.drawer_settings); 

     refreshDrawer(); 
    } 

    private ActionBarDrawerToggle createDrawerToggle() { 
     return new ActionBarDrawerToggle(this, mDrawerLayout, R.drawable.ic_drawer, R.string.drawer_open, R.string.drawer_close); 
    } 

    @Override 
    public boolean onPrepareOptionsMenu(Menu menu) { 
     refreshActionBar(); 

     int size = menu.size(); 
     mMenuItemIds = new int[size]; 
     for (int i = 0; i < size; i++) { 
      mMenuItemIds[i] = menu.getItem(i).getItemId(); 
     } 

     return super.onPrepareOptionsMenu(menu); 
    } 

    @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); 
     mDrawerToggle.syncState(); 
    } 

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

    protected boolean isDrawerOpen() { 
     return mDrawerLayout.isDrawerOpen(mDrawerView); 
    } 

    /** 
    * Update the title and invalidate the options menu 
    */ 
    protected void refreshActionBar() { 
     if (isDrawerOpen()) { 
      setActionBarItemsAlpha(0); 
     } else { 
      getSupportActionBar().setTitle(getTitle()); 
     } 
    } 

    /** 
    * Update the selected item. 
    */ 
    protected void refreshDrawer() { 
     Navigation id = Navigation.getId(this); 
     if(id != null) { 
      mDrawerList.setItemChecked(id.ordinal(), true); 
     } 
    } 

    protected void onDrawerItemClick(int which) { 
     // Override if subclass needs to listen for Drawer click events 
    } 

    private class DrawerItemClickListener implements ListView.OnItemClickListener { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
      selectDrawerItem(position); 
     } 
    } 

    protected void selectDrawerItem(final int which) { 
     Navigation id = Navigation.getId(this); 
     if (id != null && which == id.ordinal()) { 
      return; 
     } 

     onDrawerItemClick(which); 
     mPendingLaunch = DrawerUtils.buildLaunchRunnable(this, which); 

     mDrawerLayout.closeDrawer(mDrawerView); 
    } 
} 

하지만 당신은 서랍의 아이콘 아래의 스크린 샷에서 볼 수 있듯이 일부 장치에 다른 사람에 렌더링의 전혀 렌더링되지 않았습니다. 내가 안드로이드 모니터를 체크인 할 때 레이아웃은 너비가 0입니다. 무슨 일이 벌어 지는지에 대한 단서가 있습니까?

Failing drawer

+0

게시물'R.layout.action_bar' – mmlooloo

답변

2

당신이 APPCOMPAT의 V21을 사용하는 경우, 당신은 당신이 사용되지 않는 V4 버전보다는 android.support.v7.app.ActionBarDrawerToggle를 사용해야합니다.

+0

감사합니다. 다음 단계는 서랍 아이콘의 드로어 블을 변경할 수 있도록 툴바를 구현하는 것입니다. 툴바 없이는 할 수 없다는 동정 – Raul

+0

정말요? 테마에서 완료되면 서랍 아이콘의 스타일을 지정하는 데 툴바를 사용할 필요가 없습니다. http://stackoverflow.com/a/26440502/1676363 – ianhanniballake