Кнопка переключения не работает для панели навигации

Я реализую навигационный ящик для своего приложения для Android. Я заставил ящик работать, перетаскивая его сбоку, но кнопка «Домой/переключатель» на панели действий не меняется на значок, который я хочу, и не реагирует на щелчки, так как методы onDrawerClosed и onDrawerOpened, определенные в нем, называются . Мой код выглядит следующим образом:

    <?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_layout"
     android:layout_width="match_parent"
     android:layout_height="match_parent">


    <fragment
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/loadingFragment"
        android:name="com.whostr.clients.android.LoadingFragment" />

    <fragment 
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/eventFragment"
        android:name="com.whostr.clients.android.EventDisplayFragment"/>

    <fragment 
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/emptyFragment"
        android:name="com.whostr.clients.android.EmptyView"/>



<!--  Listview to display slider menu -->
<ListView android:id="@+id/left_drawer"
    android:layout_width = "240dp"
    android:layout_height = "match_parent"
    android:layout_gravity = "start"
    android:choiceMode = "singleChoice"
    android:dividerHeight = "1dp"
    android:divider = "@android:color/transparent"
    android:background="#111"
    />

And in the activity I have the following code:

    @Override
public void onCreate(Bundle savedDataInstace)
{
    super.onCreate(savedDataInstace);
    setContentView(R.layout.eventdisplay);

    fm = getSupportFragmentManager();
    //get fragments by id
    fragments[EVENT_VIEW]= fm.findFragmentById(R.id.eventFragment);
    fragments[LOADING] = fm.findFragmentById(R.id.loadingFragment);
    fragments[EMPTY_VIEW] = fm.findFragmentById(R.id.emptyFragment);


    menuList = getResources().getStringArray(R.array.menuArray);
    mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
    mDrawerList = (ListView) findViewById(R.id.left_drawer);

    mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, R.drawable.ic_drawer, R.string.drawwer_open, R.string.drawer_closed)
                        {
                            /*
                             * Called when a drawer has settled in a completely closed state
                             */
                            public void onDrawerClosed(View view)
                            {
                                Log.d("drawerToggle", "Drawer closed");
                                super.onDrawerClosed(view);
                                getActionBar().setTitle(R.string.app_name);
                                invalidateOptionsMenu(); //Creates call to onPrepareOptionsMenu()
                            }

                            /*
                             * Called when a drawer has settled in a completely open state
                             */
                            public void onDrawerOpened(View drawerView)
                            {
                                Log.d("drawerToggle", "Drawer opened");
                                super.onDrawerOpened(drawerView);
                                getActionBar().setTitle("NavigationDrawer");
                                invalidateOptionsMenu();
                            }
                        };
    mDrawerLayout.setDrawerListener(mDrawerToggle);

    //Set the adapter for the list view
    mDrawerList.setAdapter(new ArrayAdapter<String>(this, R.layout.drawer_list_item, menuList));
    mDrawerList.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> arg0, View view, int position,
                long id) {
            Log.d("navigationDrawer", "Clicked on an item");
        }

    });


    FragmentTransaction transaction = fm.beginTransaction();

    //Hide the event view
    transaction.hide(fragments[EVENT_VIEW]);
    transaction.hide(fragments[EMPTY_VIEW]);
    transaction.commit();

    AsyncTask<String, Void, EventResponseCollection> task = new GetEventsNearByAsyncTask().execute();
    try {
        if(task != null)
            events = task.get().getItems();

    } catch (InterruptedException | ExecutionException e) {
        Log.d("viewEvent", "Error when retrieving task details " + e.getMessage());
    }

    if(events == null)
    {
        //show create your own event fragment
        changeFragment(EMPTY_VIEW);
    }
    else
    {
        Log.d("viewEvent", "I have " + events.size());
        //show proper fragment with the first event displayed
        currentEvent = events.get(eventIndex);
        ((EventDisplayFragment) fragments[EVENT_VIEW]).updateFragment(currentEvent);
        changeFragment(EVENT_VIEW);
    }
}

    @Override
public boolean onOptionsItemSelected(MenuItem item)
{
    Log.d("onOptionsItemSelected", "In the on item select");
    //Pass the event to ActionBarDrawerToggle, if it returns
    //true, then it has handled the app icon touch event
    if(mDrawerToggle.onOptionsItemSelected(item))
    {
        Log.d("onOptionsItemSelected", "Clicked on action bar item");
        return true;
    }

    //Handle your other action bar items...

    return super.onOptionsItemSelected(item);
}

У кого-нибудь есть предложения о том, что я могу сделать? Я пробовал все решения, которые я нашел в Интернете, чтобы заставить эту работу работать, но, видимо, мне не повезло, и, похоже, ничего не работает :(


person redspider    schedule 24.04.2014    source источник


Ответы (5)


Вы должны добавить что-то подобное в свою активность

@Override
public boolean onOptionsItemSelected(android.view.MenuItem item) {
    return drawerToggle.onOptionsItemSelected(item);
}
person Dmitry    schedule 24.04.2014
comment
Я уже перезаписал этот метод, но по какой-то причине он никогда не вызывается :(. Я добавил код этого метода в предыдущем посте. - person redspider; 25.04.2014

Это сработало для меня, это почти как предыдущий пост

public boolean onOptionsItemSelected(MenuItem item) {
    // Handle presses on the action bar items
    if (mDrawerToggle.onOptionsItemSelected(item)) {
        return true;
      } }
person ZeWolfe15    schedule 17.05.2014
comment
Это больше соответствует Руководству по дизайну Android Drawer. Кроме того, если он доходит до конца метода (без ввода if), то он должен return super.onOptionsItemSelected(item); - person Dylan Vander Berg; 09.08.2015

Хорошо, это было небольшое упущение с моей стороны, я забыл включить следующие 2 строки кода:

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

в методе onCreate.

person redspider    schedule 29.04.2014

Я столкнулся с подобной проблемой. Я надеюсь, что этот ответ может помочь кому-то, столкнувшемуся с подобной проблемой. Проверьте атрибут openDrawer в макете вашего ящика.

tools:openDrawer="start"

Кроме того, проверьте режим блокировки ящика в своей деятельности и удалите его, если вы случайно заблокировали ящик.

//drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
person user3804372    schedule 27.09.2016

Спустя годы, но в любом случае..... это может помочь любому, когда у вас есть макет с Drawerlayout, Drawer предполагает, что первый дочерний элемент - это вид, который перекрывается при отображении, а второй дочерний элемент - это панель навигации. Итак, в вашем случае вы можете сделать что-то вроде...

enter code here

<?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_layout"
 android:layout_width="match_parent"
 android:layout_height="match_parent">

<RelativeLayout 
 android:layout_width="match_parent"
 android:layout_height="match_parent">

<fragment
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/loadingFragment"
    android:name="com.whostr.clients.android.LoadingFragment" />

<fragment 
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/eventFragment"
    android:name="com.whostr.clients.android.EventDisplayFragment"/>

<fragment 
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/emptyFragment"
    android:name="com.whostr.clients.android.EmptyView"/>

</RelativeLayout>

<!--  Listview to display slider menu -->
<ListView android:id="@+id/left_drawer"
android:layout_width = "240dp"
android:layout_height = "match_parent"
android:layout_gravity = "start"
android:choiceMode = "singleChoice"
android:dividerHeight = "1dp"
android:divider = "@android:color/transparent"
android:background="#111"
/>

Таким образом, Drawer знает, что RelativeLayout — это представление, которое должно перекрываться, а ListView — это левая панель, которую вы хотите.

Также вы должны сделать в java-коде все, что вы знаете... настроить панель инструментов, настроить ящик, указывающий на панель инструментов, настроить инструмент и т. д... все это в комментариях.

person Yudel Martínez    schedule 05.07.2017