ナビゲーションビュー付きのナビゲーションドロワーを実装しました。そして、私はmenu.xmlファイルを介してナビゲーションビューに値を追加しています。
<Android.support.design.widget.NavigationView
Android:id="@+id/nvView"
Android:layout_width="wrap_content"
Android:layout_height="match_parent"
Android:layout_gravity="start"
app:itemTextColor="@Android:color/white"
Android:background="?attr/colorAccent"
app:menu="@menu/drawer_view"
app:headerLayout="@layout/nav_header"
>
</Android.support.design.widget.NavigationView>
すべてがうまく機能していますが、私は問題に直面しています、メニューをクリックした後、サブメニューを表示したいです。
私は多くのことを試しました:-
Item内のmenu.xmlにサブメニューを追加します。こんな感じ.
<menu xmlns:Android="http://schemas.Android.com/apk/res/Android">
<group Android:checkableBehavior="single">
<item
Android:id="@+id/nav_ChangeOutlet_fragment"
Android:icon="@drawable/home_icon"
Android:title="@string/changeOutlet"
Android:checked="true">
<menu>
<group>
<item
Android:title="one"></item>
<item
Android:title="two"></item>
<item
Android:title="three"></item>
</group>
</menu>
次に、このような出力が返されます。
出力:このリンクをクリックして出力を表示します
https://drive.google.com/file/d/0B0B9-WZYydK7RG1yY0tRdkhOSW8/view?usp=sharing
問題は、この方法ではmenuをクリックできないことです。ここではサブメニューのみがクリック可能です。
ここでサブメニューを表示するには、メニューをクリックした後にのみ、そうでない場合はサブメニューが他に表示されるか、または非表示状態にある
最適な解決策は、ナビゲーションビューに展開可能なリストビューを用意することです。下のコードを参照してくださいactivity_navigation_view.xml
<Android.support.v4.widget.DrawerLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto"
Android:id="@+id/drawer_layout"
Android:layout_height="match_parent"
Android:layout_width="match_parent"
Android:fitsSystemWindows="true">
<include layout="@layout/navigation_view_fragment_container"/>
<Android.support.design.widget.NavigationView
Android:id="@+id/nav_view"
Android:layout_height="match_parent"
Android:layout_width="wrap_content"
Android:layout_gravity="start"
Android:fitsSystemWindows="true"
app:headerLayout="@layout/navigation_view_header">
<ExpandableListView
Android:layout_width="wrap_content"
Android:layout_height="match_parent"
Android:background="@Android:color/white"
Android:layout_marginTop="192dp"
Android:id="@+id/navigationmenu">
</ExpandableListView>
</Android.support.design.widget.NavigationView>
</Android.support.v4.widget.DrawerLayout>
レイアウトナビゲーションヘッダーは次のとおりですnavigation_view_header.xml
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="192dp"
Android:background="#ff5722"
Android:padding="16dp"
Android:theme="@style/ThemeOverlay.AppCompat.Dark"
Android:orientation="vertical"
Android:gravity="bottom">
<TextView
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:text="Username"
Android:textAppearance="@style/TextAppearance.AppCompat.Body1"/>
</LinearLayout>
ナビゲーションビューアクティビティで、拡張可能なリストビューのアダプタを設定します。 NavigationViewActivity.Java
public class NavigationViewActivity extends AppCompatActivity {
private DrawerLayout mDrawerLayout;
ExpandableListAdapter mMenuAdapter;
ExpandableListView expandableList;
List<ExpandedMenuModel> listDataHeader;
HashMap<ExpandedMenuModel, List<String>> listDataChild;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_navigation_view);
final ActionBar ab = getSupportActionBar();
/* to set the menu icon image*/
ab.setHomeAsUpIndicator(R.drawable.ic_menu);
ab.setDisplayHomeAsUpEnabled(true);
mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
expandableList= (ExpandableListView) findViewById(R.id.navigationmenu);
NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
if (navigationView != null) {
setupDrawerContent(navigationView);
}
prepareListData();
mMenuAdapter = new ExpandableListAdapter(this, listDataHeader, listDataChild, expandableList);
// setting list adapter
expandableList.setAdapter(mMenuAdapter);
}
private void prepareListData() {
listDataHeader = new ArrayList<String>();
listDataChild = new HashMap<String, List<String>>();
// Adding data header
listDataHeader.add("heading1");
listDataHeader.add("heading2");
listDataHeader.add("heading3");
// Adding child data
List<String> heading1= new ArrayList<String>();
heading1.add("Submenu of item 1");
List<String> heading2= new ArrayList<String>();
heading2.add("Submenu of item 2");
heading2.add("Submenu of item 2");
heading2.add("Submenu of item 2");
listDataChild.put(listDataHeader.get(0), heading1);// Header, Child data
listDataChild.put(listDataHeader.get(1), heading2);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case Android.R.id.home:
mDrawerLayout.openDrawer(GravityCompat.START);
return true;
}
return super.onOptionsItemSelected(item);
}
private void setupDrawerContent(NavigationView navigationView) {
navigationView.setNavigationItemSelectedListener(
new NavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(MenuItem menuItem) {
menuItem.setChecked(true);
mDrawerLayout.closeDrawers();
return true;
}
});
}
@Override
public void onFragmentInteraction(Boolean isDataSaved) {
}
}
拡張可能なリストビューのアダプタは次のとおりです。
public class ExpandableListAdapter extends BaseExpandableListAdapter {
private Context mContext;
private List<String> mListDataHeader; // header titles
// child data in format of header title, child title
private HashMap<String, List<String>> mListDataChild;
ExpandableListView expandList;
public ExpandableListAdapter(Context context, List<String> listDataHeader,HashMap<String, List<String>> listChildData,ExpandableListView mView)
{
this.mContext = context;
this.mListDataHeader = listDataHeader;
this.mListDataChild = listChildData;
this.expandList=mView;
}
@Override
public int getGroupCount() {
int i= mListDataHeader.size();
Log.d("GROUPCOUNT",String.valueOf(i));
return this.mListDataHeader.size();
}
@Override
public int getChildrenCount(int groupPosition) {
int childCount=0;
if(groupPosition!=2)
{
childCount=this.mListDataChild.get(this.mListDataHeader.get(groupPosition))
.size();
}
return childCount;
}
@Override
public Object getGroup(int groupPosition) {
return this.mListDataHeader.get(groupPosition);
}
@Override
public Object getChild(int groupPosition, int childPosition) {
Log.d("CHILD",mListDataChild.get(this.mListDataHeader.get(groupPosition))
.get(childPosition).toString());
return this.mListDataChild.get(this.mListDataHeader.get(groupPosition))
.get(childPosition);
}
@Override
public long getGroupId(int groupPosition) {
return groupPosition;
}
@Override
public long getChildId(int groupPosition, int childPosition) {
return childPosition;
}
@Override
public boolean hasStableIds() {
return false;
}
@Override
public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
ExpandedMenuModel headerTitle = (ExpandedMenuModel) getGroup(groupPosition);
if (convertView == null) {
LayoutInflater infalInflater = (LayoutInflater) this.mContext
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = infalInflater.inflate(R.layout.listheader, null);
}
TextView lblListHeader = (TextView) convertView
.findViewById(R.id.submenu);
ImageView headerIcon= (ImageView)convertView.findViewById(R.id.iconimage);
lblListHeader.setTypeface(null, Typeface.BOLD);
lblListHeader.setText(headerTitle.getIconName());
headerIcon.setImageDrawable(headerTitle.getIconImg());
return convertView;
}
@Override
public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
final String childText = (String) getChild(groupPosition, childPosition);
if (convertView == null) {
LayoutInflater infalInflater = (LayoutInflater) this.mContext
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = infalInflater.inflate(R.layout.list_submenu, null);
}
TextView txtListChild = (TextView) convertView
.findViewById(R.id.submenu);
txtListChild.setText(childText);
return convertView;
}
@Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
return true;
}
}
list_submenu.xmlは次のとおりです
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:orientation="vertical" Android:layout_width="match_parent"
Android:layout_height="match_parent">
<TextView
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:padding="10dp"
Android:textColor="#000000"
Android:layout_marginLeft="20dp"
Android:textSize="18sp"
Android:id="@+id/submenu"/>
</LinearLayout>
listheader.xmlは次のとおりです
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
Android:layout_width="match_parent"
Android:layout_height="2dp"
Android:orientation="vertical"
xmlns:Android="http://schemas.Android.com/apk/res/Android" >
<LinearLayout
Android:layout_width="match_parent"
Android:layout_height="match_parent">
<ImageView
Android:layout_width="50dp"
Android:layout_height="50dp"
Android:paddingBottom="10dp"
Android:paddingLeft="10dp"
Android:paddingTop="10dp"
Android:id="@+id/iconimage"/>
<TextView
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:padding="10dp"
Android:textColor="#000000"
Android:textSize="20sp"
Android:id="@+id/submenu"/>
</LinearLayout>
</LinearLayout>
わかりやすくするために、コード全体を掲載しました。お役に立てれば.......
サイドナビゲーションドロワーでカスタムレイアウトを使用することをお勧めします。
サンプルリンク- ナビゲーションドロワーでカスタムレイアウトを実装する方法
また、シナリオのサイドナビゲーションドロワーに展開可能なリストビューを実装する必要があります。 here は、展開可能なリストビューのサンプルです。
ナビゲーションドロワーと拡張可能なリストを実現するには、両方を組み合わせる必要があります。