2013-10-07 4 views
9

Im пытается использовать выдвижной ящик в панели действий с sherlock. Это моя основная деятельность:ActionBarSherlock Side Menu Navigation Drawer

import uk.co.senab.actionbarpulltorefresh.extras.actionbarsherlock.PullToRefreshAttacher; 
import android.content.res.Configuration; 
import android.os.Bundle; 
import android.support.v4.app.ActionBarDrawerToggle; 
import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentManager; 
import android.support.v4.widget.DrawerLayout; 
import android.view.View; 
import android.widget.AdapterView; 
import android.widget.AdapterView.OnItemClickListener; 
import android.widget.ArrayAdapter; 
import android.widget.ListView; 

import com.actionbarsherlock.app.SherlockFragmentActivity; 
import com.actionbarsherlock.view.MenuItem; 
import com.mejorandroid.ejemplo3_clase3.fragments.MainFragment; 
import com.mejorandroid.ejemplo3_clase3.fragments.TermsFragment; 

public class MainActivity extends SherlockFragmentActivity 
          implements OnItemClickListener{ 

    private ListView drawer_list; 
    private DrawerLayout drawer_layout; 
    private ActionBarDrawerToggle drawer_toggle; 

    private PullToRefreshAttacher pullToRefreshAttacher; 

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

     pullToRefreshAttacher = PullToRefreshAttacher.get(this); 

     drawer_list = (ListView) findViewById(R.id.left_drawer); 
     drawer_layout = (DrawerLayout) findViewById(R.id.drawer_layout); 

     ArrayAdapter<String> drawer_adapter = new ArrayAdapter<String>(this, 
       R.layout.drawer_list_item, getResources().getStringArray(
         R.array.array_drawer_options)); 

     drawer_list.setAdapter(drawer_adapter); 
     drawer_list.setOnItemClickListener(this); 

     selectItem(0); 

     drawer_toggle = new ActionBarDrawerToggle(this, drawer_layout, R.drawable.ic_drawer, R.string.drawer_open, R.string.drawer_close){ 
      @Override 
      public void onDrawerClosed(View drawerView) { 
       supportInvalidateOptionsMenu(); 
      } 

      @Override 
      public void onDrawerOpened(View drawerView) { 
       supportInvalidateOptionsMenu(); 
      } 
     }; 

     drawer_layout.setDrawerListener(drawer_toggle); 

     getSherlock().getActionBar().setDisplayHomeAsUpEnabled(true); 
     getSherlock().getActionBar().setHomeButtonEnabled(true); 
    } 

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

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

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 

     if(item.getItemId() == android.R.id.home || drawer_toggle.onOptionsItemSelected(item)){ 
      return true; 
     } 
     return super.onOptionsItemSelected(item); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(com.actionbarsherlock.view.Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getSupportMenuInflater().inflate(R.menu.main, menu); 
     return true; 
    } 

    public PullToRefreshAttacher getAttacher() { 

     return pullToRefreshAttacher; 
    } 

    public void selectItem(int position){ 
     Fragment f; 

     if(position==0){ 
      f = new MainFragment(); 
     }else{ 
      f = new TermsFragment(); 
     } 

     FragmentManager fm = getSupportFragmentManager(); 
     fm.beginTransaction() 
      .replace(R.id.main_content, f) 
      .commit(); 

     drawer_list.setItemChecked(position, true); 
     setTitle(drawer_list.getItemAtPosition(position).toString()); 
     drawer_layout.closeDrawer(drawer_list); 
    } 
    @Override 
    public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) { 
     selectItem(position); 
    } 

} 

В методе onOptionsItemSelected:

@Override 
    public boolean onOptionsItemSelected(MenuItem item) { 

     if(item.getItemId() == android.R.id.home || drawer_toggle.onOptionsItemSelected(item)){ 
      return true; 
     } 
     return super.onOptionsItemSelected(item); 
    } 

я получаю:

enter image description here

Как я могу это исправить ??

Это мой main.xml:

<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/drawer_layout" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

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

    <ListView 
     android:id="@+id/left_drawer" 
     android:layout_width="240dp" 
     android:layout_height="match_parent" 
     android:layout_gravity="start" 
     android:choiceMode="singleChoice" 
     android:divider="@android:color/transparent" 
     android:dividerHeight="0dp" 
     android:background="#111"/> 

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

Вы импортируете правильный класс «MenuItem»? ActionBarSherlock предоставляет 'com.actionbarsherlock.view.MenuItem', тогда как метод' ActionBarDrawerToggle.onOptionsItemSelected() 'SDK Android SDK ожидает' android.view.MenuItem'. –

+0

Да, я добавил импорт к вопросу. – kiduxa

+1

См. [Здесь] (https://github.com/JakeWharton/ActionBarSherlock/issues/941) и [здесь] (https://github.com/JakeWharton/ActionBarSherlock/pull/946) для объяснения причин, почему и многие потенциальные решения. –

ответ

35

У меня была такая же проблема, и это работает для меня:

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 

    if (item.getItemId() == android.R.id.home) { 

     if (drawer_layout.isDrawerOpen(drawer_list)) { 
      drawer_layout.closeDrawer(drawer_list); 
     } else { 
      drawer_layout.openDrawer(drawer_list); 
     } 
    } 

    return super.onOptionsItemSelected(item); 
} 

Я не знаю, если эта проблема уже исправлена ​​в новейший выпуск библиотеки библиотеки/библиотеки Sherlock, но обходной путь делает хорошую работу.

+0

Да, это работает! Благодарю. Как только последний вопрос, как я могу отобразить ic_drawer вместо кнопки «вверх»? – kiduxa

+0

Попробуйте заменить getSherlock(). GetActionBar() .. с помощью getSupportActionBar(). Это единственное различие, которое я вижу. Если это не сработает, обратите внимание на комментарий Can Gokderes. –

+0

Нет, это не проблема. В новых устройствах я вижу ic_drawer, но в более старых устройствах просто появляется кнопка вверх. Думаю, это еще одна проблема. Спасибо в любом случае;) – kiduxa