2015-04-17 2 views
0

Я пытаюсь открыть свой навигационный ящик с помощью кнопки ActionBarActivity Up в течение нескольких часов, но я просто не могу ее обработать.Кнопка Android ActionBar Up не откроет навигационный ящик

Прямо сейчас я могу открыть его, прокручивая/сдвигая вправо, и я вижу стрелку вверх/назад в ActionBar, но ящик навигации не открывается, как только я нажимаю кнопку.

Обратите внимание, что я использую Support v7 ActionBarDrawerToggle.

Вот мой ActionBarActivity-х onCreate:

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

    if (savedInstanceState == null) { 
     getFragmentManager().beginTransaction() 
       .add(R.id.container, new HomeFragment()) 
       .commit(); 
    } 

    Log.d(TAG, "onCreate"); 

    getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
    getSupportActionBar().setHomeButtonEnabled(true); 
    mDrawerLayout = (DrawerLayout) findViewById(R.id.main_drawer_layout); 
    mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, R.string.drawer_open, R.string.drawer_close); 
    mDrawerLayout.setDrawerListener(mDrawerToggle); 
    mDrawerToggle.setDrawerIndicatorEnabled(true); 
} 

@Override 
protected void onPostCreate(Bundle savedInstanceState) { 
    super.onPostCreate(savedInstanceState); 
    Log.d(TAG, "onPostCreate"); 
    mDrawerToggle.syncState(); 
} 

ли я что-то отсутствует? Возможно, есть вызов метода, который связывает кнопку Up/Back ActionBar с DrawerToggle?

Любая помощь/руководство очень ценится.

Обновление: Я также пробовал использовать mDrawerToggle.syncState(); и ничего не изменилось. Обновлен метод onCreate выше, чтобы включить вызов syncState.

Обновление 2: Я снова обновил код до того, как он находится в моем файле MainActivity. Я сделал несколько изменений, как было предложено, но ящик все равно не откроется.

Я испытал это в двух устройствах: в HTC One M7 с Android 5.0.2 и Sense 6.5 и в x86 AVD эмулятор работает Lollipop SDK 21.

ответ

3

Посмотрите на мои коды первых:

public class HomeActivity extends ActionBarActivity implements 
    DrawerCloseListener { 
private Toolbar toolbar; 
private DrawerLayout drawer; 
private ActionBarDrawerToggle drawerToggle; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_home); 
    toolbar = (Toolbar) findViewById(R.id.home_toolbar); 
    toolbar.setNavigationIcon(R.drawable.icon_nav); 
    setSupportActionBar(toolbar); 
    drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
    drawerToggle = new ActionBarDrawerToggle(this, drawer, toolbar, 
      R.string.app_name, R.string.app_name); 
    drawerToggle.setHomeAsUpIndicator(R.drawable.icon_nav); 
    drawer.setDrawerListener(drawerToggle); 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    if (drawerToggle.onOptionsItemSelected(item)) { 
     return true; 
    } 
    // Handle action bar item clicks here. The action bar will 
    // automatically handle clicks on the Home/Up button, so long 
    // as you specify a parent activity in AndroidManifest.xml. 
    return super.onOptionsItemSelected(item); 
} 

@Override 
public void onConfigurationChanged(Configuration newConfig) { 
    // TODO Auto-generated method stub 
    super.onConfigurationChanged(newConfig); 
    drawerToggle.onConfigurationChanged(newConfig); 
} 

@Override 
protected void onPostCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onPostCreate(savedInstanceState); 
    drawerToggle.syncState(); 
} 

@Override 
public void onBackPressed() { 
    // TODO Auto-generated method stub 
    if (drawer.isDrawerOpen(Gravity.LEFT | Gravity.START)) { 
     drawer.closeDrawers(); 
     return; 
    } 
    super.onBackPressed(); 
} 

@Override 
public void onDrawerClose() { 
    // TODO Auto-generated method stub 
    if (drawer.isDrawerOpen(Gravity.LEFT | Gravity.START)) { 
     drawer.closeDrawers(); 
    } 
} 
} 

И среди кодов выше, я заменил ActionBar на ToolBar, но вы все еще можете использовать ActionBar, где есть ToolBar. Вы что-то пропустили?

+0

Нельзя ли это сделать без замены ActionBar по умолчанию на панели инструментов? Это может сработать, но кажется слишком утомительным для кажущейся простой задачи. Я попробую это, если я не смогу сделать эту работу без замены ActionBar по умолчанию. В любом случае, спасибо! Я дам вам знать, если это сработает. – Cramps

+0

'ToolBar' является обобщением' ActionBar'. Где вы можете использовать «ActionBar», вы можете использовать «ToolBar». – SilentKnight

+0

Я только что закончил реализацию «Пути инструментов», и он работает по назначению. Спасибо! :) – Cramps

0

Вам необходимо синхронизировать ящик тумблер в порядке чтобы получить кнопку до хорошо ... :) синхронизации

mDrawerToggle.syncState();

+0

Я попробовал это незадолго до того, задавая этот вопрос, и он не работает, либо. Мои извинения! Я пропустил добавление его в код 'onCreate' выше, так как я отключил это изменение после его попытки. Я уточню свой вопрос. – Cramps

+0

Вы пытались переместить '.syncState()' в 'onPostExecute()' http://stackoverflow.com/a/20655364/3474528 –

+0

Я полагаю, вы имели в виду 'onPostCreate'? Я просто попытался, и ничего не изменилось. Я не понимаю, что здесь не так. – Cramps

0

Я думаю, вы должны добавить

mDrawerToggle.setDrawerIndicatorEnabled(true); 

и переместить эту линию mDrawerLayout.setDrawerListener(mDrawerToggle); после mDrawerToggle = new ActionBarDrawerToggle(...);

Edit: После того, как я снова проверил мой код, закрытие и открытие обрабатывается в отдельном методе

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
    case android.R.id.home: 
     if(mDrawerLayout.isDrawerOpen(drawerList)) { 
      mDrawerLayout.closeDrawer(drawerList); 
     } 
     else { 
      mDrawerLayout.openDrawer(drawerList); 
     } 
     return true; 
    default: 
     return super.onOptionsItemSelected(item); 
    } 
} 
+0

Я переместил строки и добавил «setDrawerIndicatorEnabled (true)» сразу, но ничего не изменилось. Я обновлю вопрос с помощью моего текущего кода. – Cramps

+0

Это хорошая идея, однако, когда я удаляю эти строки, значок ящика в ActionBar полностью исчезает! Как вы добавили значок DrawerToggle в ActionBar? – Cramps

+0

Вы имеете в виду значок левой стрелки? Вызывая mDrawerToggle.setDrawerIndicatorEnabled (true); Если вы используете белый или черный фон, этот значок может быть похоронен, потому что он также белый или черный (в зависимости от тем). Или вы также можете установить его как false и использовать mDrawerToggle.setHomeAsUpIndicator (R.drawable.custom_icon); чтобы использовать свой собственный значок. – inmyth

0

Вы должны изменить порядок двух линий:

1.

mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, R.string.drawer_open, R.string.drawer_close); 

затем 2.

mDrawerLayout.setDrawerListener(mDrawerToggle); 

Поскольку при установке setDrawerListenermDrawerToggle объекта не было инициализирован

Надеется, что это будет решить вашу работу

+0

Я переключил линии, но это не сработало. Я обновлю вопрос с помощью моего текущего кода! – Cramps

Смежные вопросы