Переключить ящик навигации «открыть» при нажатии кнопки/изображения

Я создал фрагмент, привязанный к XML, содержащему одно представление изображения. Ящик навигации (с использованием панели действий) настроен внутри activity_main.java и работает нормально. Что я хочу сделать, так это то, что когда я нажимаю на изображение внутри фрагмента, панель навигации должна «открываться».

Следующий код внутри метода onCreateView возвращает нулевой указатель:

    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedinstanceState)
            {   

                View view=inflater.inflate(R.layout.home, container, false);

                ImageView img=(ImageView)view.findViewById(R.id.imageView1);

               // Defined inside activity_main.xml
                final LinearLayout mDrawer = (LinearLayout) view.findViewById(R.id.drawer); 

               // Defined inside activity_main.xml
                final DrawerLayout mDrawerLayout = (DrawerLayout)view.findViewById(R.id.drawer_layout); 

                img.setOnClickListener(new OnClickListener() {

                    @Override
                    public void onClick(View v) {

                     mDrawerLayout.openDrawer(mDrawer);

                    }
                });

                return view;    
                }

Нулевой указатель возвращается в следующем операторе:

mDrawerLayout.openDrawer(mDrawer);


person sabergeek    schedule 12.03.2014    source источник


Ответы (3)


Эти строки ссылаются на неправильное представление:

final LinearLayout mDrawer = (LinearLayout) view.findViewById(R.id.drawer); 
final DrawerLayout mDrawerLayout = (DrawerLayout)view.findViewById(R.id.drawer_layout);

Они ищут ящик в «R.layout.home», потому что это то, что вы надуваете и устанавливаете в переменную представления, а findViewById() возвращает null, потому что его там нет.

Если это представление является дочерним по отношению к activity_main, вы сможете изменить их на:

final LinearLayout mDrawer = (LinearLayout) getActivity().findViewById(R.id.drawer); 
final DrawerLayout mDrawerLayout = (DrawerLayout) getActivity().findViewById(R.id.drawer_layout);

Кроме того, я бы сделал этих членов класса, а не окончательными.

person Steven Trigg    schedule 12.03.2014

Работает при нажатии кнопки

mButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            drawer.openDrawer(GravityCompat.START);

        }
    });

Работает при нажатии на изображение

mImageview.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            drawer.openDrawer(GravityCompat.START);

        }
    });
person Maksudul Hasan Raju    schedule 06.11.2016

Вам нужно использовать его так в своей деятельности:

final DrawerLayout mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
imageViewMenu = (ImageView)  findViewById(R.id.imageViewMenu);
imageViewMenu.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        mDrawerLayout.openDrawer(Gravity.START);
    }
});
person Hossin Asaadi    schedule 07.03.2018