单击抽屉的任何项目而不在android中关闭时更改导航抽屉内的视图和内容

Posted

技术标签:

【中文标题】单击抽屉的任何项目而不在android中关闭时更改导航抽屉内的视图和内容【英文标题】:Changing the view and content inside navigation drawer when clicking on any item of drawer without closing in android 【发布时间】:2015-12-08 21:27:19 【问题描述】:

我是 android 新手,所以我制作了导航抽屉,但我想更改内部列表的视图或内容

当我们点击抽屉内的这个类别时THis is first page link

这是另一个页面this is second page link,它会在不关闭抽屉的情况下出现。如果您能提供任何关于此的逻辑,请告诉我

这是我制作的第二个列表但是我希望当我单击导航抽屉的任何项目而不关闭它时显示此列表

package com.teamtreehouse.oslist;

import android.app.Activity;
import android.content.res.Configuration;
import android.graphics.Color;
import android.os.Bundle;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.ExpandableListView;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;


public class MainActivity extends Activity 

    private DrawerLayout mDrawerLayout;

    private ActionBarDrawerToggle mDrawerToggle;

    private String mActivityTitle;
    ExpandableListAdapter listAdapter;
    ExpandableListView expListView;
    List<String> listDataHeader;
    HashMap<String, List<String>> listDataChild;

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

        expListView = (ExpandableListView)findViewById(R.id.navList);mDrawerLayout = (DrawerLayout)findViewById(R.id.drawer_layout);
        expListView.setBackgroundColor(Color.WHITE);
        expListView.setGroupIndicator(null);
        mActivityTitle = getTitle().toString();
        prepareListData();

        addDrawerItems();
        setupDrawer();

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

    private void addDrawerItems() 

        listAdapter = new ExpandableListAdapter(this, listDataHeader, listDataChild);

        // setting list adapter
        expListView.setAdapter(listAdapter);

        Log.d("tag", "here i am in addDrawerItems");

        // Listview Group click listener
        expListView.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() 

            @Override
            public boolean onGroupClick(ExpandableListView parent, View v,
                                        int groupPosition, long id) 
                // Toast.makeText(getApplicationContext(),
                // "Group Clicked " + listDataHeader.get(groupPosition),
                // Toast.LENGTH_SHORT).show();
                Log.d("tag", "here i am in setOngroupclick listitener");

                return true;
            
        );

        // Listview Group expanded listener
        expListView.setOnGroupExpandListener(new ExpandableListView.OnGroupExpandListener() 

            @Override
            public void onGroupExpand(int groupPosition) 
                Toast.makeText(getApplicationContext(),
                        listDataHeader.get(groupPosition) + " Expanded",
                        Toast.LENGTH_SHORT).show();
                Log.d("tag", "here i am in setOnGroupExpandListener ");

            
        );

        // Listview Group collasped listener
        expListView.setOnGroupCollapseListener(new ExpandableListView.OnGroupCollapseListener() 

            @Override
            public void onGroupCollapse(int groupPosition) 
                Toast.makeText(getApplicationContext(),
                        listDataHeader.get(groupPosition) + " Collapsed",
                        Toast.LENGTH_SHORT).show();

                Log.d("tag", "here i am in setOnGroupCollapseListener ");

            
        );

        // Listview on child click listener
        expListView.setOnChildClickListener(new ExpandableListView.OnChildClickListener() 

            @Override
            public boolean onChildClick(ExpandableListView parent, View v,
                                        int groupPosition, int childPosition, long id) 
                // TODO Auto-generated method stub
                Toast.makeText(
                        getApplicationContext(),
                        listDataHeader.get(groupPosition)
                                + " : "
                                + listDataChild.get(
                                listDataHeader.get(groupPosition)).get(
                                childPosition), Toast.LENGTH_SHORT)
                        .show();

                Log.d("tag", "here i am in onChildClick ");
                return false;
            
        );
    

    private void setupDrawer() 
        mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, R.string.drawer_open, R.string.drawer_close) 

            /** Called when a drawer has settled in a completely open state. */
            public void onDrawerOpened(View drawerView) 
                super.onDrawerOpened(drawerView);
                getActionBar().setTitle("Navigation!");
                invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
            

            /** Called when a drawer has settled in a completely closed state. */
            public void onDrawerClosed(View view) 
                super.onDrawerClosed(view);
                getActionBar().setTitle(mActivityTitle);
                invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
            
        ;

        mDrawerToggle.setDrawerIndicatorEnabled(true);
        mDrawerLayout.setDrawerListener(mDrawerToggle);
    

    @Override
    protected void onPostCreate(Bundle savedInstanceState) 
        super.onPostCreate(savedInstanceState);
        // Sync the toggle state after onRestoreInstanceState has occurred.
        mDrawerToggle.syncState();
    

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

    @Override
    public boolean onCreateOptionsMenu(Menu menu) 
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    

    @Override
    public boolean onOptionsItemSelected(MenuItem item) 
        // 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.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) 
            return true;
        

        // Activate the navigation drawer toggle
        if (mDrawerToggle.onOptionsItemSelected(item)) 
            return true;
        

        return super.onOptionsItemSelected(item);
    

    private void prepareListData() 
        listDataHeader = new ArrayList<String>();
        listDataChild = new HashMap<String, List<String>>();

        // Adding child data
        listDataHeader.add("Top 250");
        listDataHeader.add("Now Showing");
        listDataHeader.add("Coming Soon..");

        // Adding child data
        List<String> top250 = new ArrayList<String>();
        top250.add("The Shawshan");
        top250.add("The Godfather");
        top250.add("The Godfathe");
        top250.add("Pulp Fiction");
        top250.add("The Good, t");
        top250.add("The Dark ");
        top250.add("12 Angry");

        List<String> nowShowing = new ArrayList<String>();
        nowShowing.add("The Conjuring");
        nowShowing.add("Despicable");
        nowShowing.add("Turbo");
        nowShowing.add("Grown U");
        nowShowing.add("Red 2");
        nowShowing.add("The Wolveri");

        List<String> comingSoon = new ArrayList<String>();
        comingSoon.add("2 Guns");
        comingSoon.add("The Smurfs 2");
        comingSoon.add("The Spectacu");
        comingSoon.add("The Canyons");
        comingSoon.add("Europa Report");

        listDataChild.put(listDataHeader.get(0), top250); // Header, Child data
        listDataChild.put(listDataHeader.get(1), nowShowing);
        listDataChild.put(listDataHeader.get(2), comingSoon);
    

这是我的 xml

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

    <!-- The first child in the layout is for the main Activity UI-->
    <RelativeLayout
        android:layout_
        android:layout_
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        android:paddingBottom="@dimen/activity_vertical_margin"
        tools:context=".MainActivity"
        android:background="#ffffffff">

        <TextView
            android:layout_
            android:layout_
            android:layout_centerHorizontal="true"
            android:text="Holy Operating Systems, Batdroid!"
            android:textSize="24sp"
            android:gravity="center"
            android:layout_marginTop="100dp"/>

        <ImageView
            android:layout_
            android:layout_
            android:src="@drawable/batdroid"
            android:layout_alignParentBottom="true"
            android:layout_centerHorizontal="true"/>

    </RelativeLayout>

    <!-- Side navigation drawer UI -->
    <FrameLayout
        android:id="@+id/content_frame"
        android:layout_
        android:layout_ />

    <ExpandableListView
        android:id="@+id/navList"
        android:layout_
        android:layout_
        android:layout_gravity="left|start" />

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

【问题讨论】:

【参考方案1】:

我已经解决了我的问题,只更改了要在视图内设置为适配器的数组

            listAdapter = new ExpandableListAdapter(MainActivity.this, listDataHeader1, listDataChild1);

            // setting list adapter
            expListView.setAdapter(listAdapter);

这是我在点击监听器内单击左侧抽屉中的任何项目时所写的内容。我想通过单击其中的任何项目来更改导航抽屉的项目。但是在点击后退按钮时,前一个项目会被加载,它不能关闭我想要的抽屉

【讨论】:

以上是关于单击抽屉的任何项目而不在android中关闭时更改导航抽屉内的视图和内容的主要内容,如果未能解决你的问题,请参考以下文章

如何单击 Flatlist 中的项目以显示另一个组件而不在抽屉中显示它

当我的手机蓝牙在 Android 应用程序中关闭时,我可以识别信标吗?

切换到下一个文本输入字段而不在 react-native 中关闭键盘

Android导航抽屉项目没有响应

当我的应用在 Ionic 中关闭时如何发送通知?

当离子菜单按钮在离子中关闭时如何触发功能