こんにちは、Gmailアプリのナビゲーションドロワーに似たナビゲーションドロワーを作成しようとしています。開発者サイトをフォローしていますが、基本的な実装についてのみ指定しています。しかし、仕様に従ってナビゲーションをカスタマイズする必要があります。
これどうやってするの?
チュートリアル Android Custom Navigation Drawer(via archive.org) には、basicとcustomプロジェクト。後者は、スクリーンショットに示すようにナビゲーションドロワーをセットアップする方法を示しています。
プロジェクトのソースコード(archive.org経由) はダウンロード可能です。
また、 Navigation Drawer-Live-O project ...
プロジェクトのソースコード はGitHubで入手できます。
MaterialDrawerライブラリ は、アプリケーションのナビゲーションドロワーの最も簡単な実装を提供することを目的としています。すぐに使えるカスタマイズが大量に提供され、AccountSwitcherとして使用できる使いやすいヘッダーも含まれています。
Android Studioには、template projectがあり、スクリーンショットに示すように、Navigation Drawer Activity。
この リポジトリ は、テンプレートに加えられた変更を追跡します。
以下のレイアウトを使用し、ナビゲーションビューでカスタムレイアウトを実現できました。
<Android.support.design.widget.NavigationView
Android:id="@+id/navi_view"
Android:layout_width="wrap_content"
Android:layout_height="match_parent"
Android:layout_gravity="start|top"
Android:background="@color/navigation_view_bg_color"
app:theme="@style/NavDrawerTextStyle">
<LinearLayout
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:orientation="vertical">
<include layout="@layout/drawer_header" />
<include layout="@layout/navigation_drawer_menu" />
</LinearLayout>
</Android.support.design.widget.NavigationView>
私にとって簡単な解決策は次のとおりです。
考慮事項:
DrawerItem
、CustomDrawerAdapter
およびレイアウトcustom_drawer_item.xml
は、 このチュートリアル から取得されました。1。カスタムドロワーアイテムをラップするためにこのクラスを作成します:
public class DrawerItem {
String ItemName;
int imgResID;
public DrawerItem(String itemName, int imgResID) {
super();
ItemName = itemName;
this.imgResID = imgResID;
}
public String getItemName() {
return ItemName;
}
public void setItemName(String itemName) {
ItemName = itemName;
}
public int getImgResID() {
return imgResID;
}
public void setImgResID(int imgResID) {
this.imgResID = imgResID;
}
}
2。引き出しアイテムのカスタムレイアウト(custom_drawer_item.xml)を作成します:
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent" >
<LinearLayout
Android:id="@+id/itemLayout"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:layout_alignParentLeft="true"
Android:orientation="vertical"
Android:layout_marginTop="0dp"
Android:background="?android:attr/activatedBackgroundIndicator">
<LinearLayout
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:minHeight="55dp">
<ImageView
Android:id="@+id/drawer_icon"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"/>
<TextView
Android:id="@+id/drawer_itemName"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:textAppearance="?android:attr/textAppearanceLarge"/>
</LinearLayout>
<View
Android:layout_width="match_parent"
Android:layout_height="1dp"
Android:layout_marginBottom="1dp"
Android:layout_marginTop="1dp"
Android:layout_marginLeft="10dp"
Android:layout_marginRight="10dp"
Android:background="#DADADC">
</View>
</LinearLayout>
</RelativeLayout>
3。カスタムアダプターを作成します:
import Java.util.List;
import Android.app.Activity;
import Android.content.Context;
import Android.view.LayoutInflater;
import Android.view.View;
import Android.view.ViewGroup;
import Android.widget.ArrayAdapter;
import Android.widget.ImageView;
import Android.widget.TextView;
public class CustomDrawerAdapter extends ArrayAdapter<DrawerItem> {
Context context;
List<DrawerItem> drawerItemList;
int layoutResID;
public CustomDrawerAdapter(Context context, int layoutResourceID, List<DrawerItem> listItems) {
super(context, layoutResourceID, listItems);
this.context = context;
this.drawerItemList = listItems;
this.layoutResID = layoutResourceID;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
DrawerItemHolder drawerHolder;
View view = convertView;
if (view == null) {
LayoutInflater inflater = ((Activity) context).getLayoutInflater();
drawerHolder = new DrawerItemHolder();
view = inflater.inflate(layoutResID, parent, false);
drawerHolder.ItemName = (TextView)view.findViewById(R.id.drawer_itemName);
drawerHolder.icon = (ImageView) view.findViewById(R.id.drawer_icon);
view.setTag(drawerHolder);
} else {
drawerHolder = (DrawerItemHolder) view.getTag();
}
DrawerItem dItem = (DrawerItem) this.drawerItemList.get(position);
drawerHolder.icon.setImageDrawable(view.getResources().getDrawable(
dItem.getImgResID()));
drawerHolder.ItemName.setText(dItem.getItemName());
return view;
}
private static class DrawerItemHolder {
TextView ItemName;
ImageView icon;
}
}
4。自動生成されたNavigationDrawerFragment
class onCreateView
メソッドで、このために自動生成されたアダプターを置き換えます:
ArrayList<DrawerItem> dataList = new ArrayList<DrawerItem>();
dataList.add(new DrawerItem(getString(R.string.title_section1), R.drawable.ic_action_1));
dataList.add(new DrawerItem(getString(R.string.title_section2), R.drawable.ic_action_2));
dataList.add(new DrawerItem(getString(R.string.title_section3), R.drawable.ic_action_3));
mDrawerListView.setAdapter(new CustomDrawerAdapter(
getActivity(),
R.layout.custom_drawer_item,
dataList));
独自のリソースのR.string.title_sectionN
とR.drawable.ic_action_N
を置き換えることを忘れないでください。
実装方法がわかれば、Androidナビゲーションドロワーを簡単にカスタマイズできます。ここにニースがあります tutorial ここで設定できます。
これは、mainXMLの構造になります。
<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 to display Fragments -->
<FrameLayout
Android:id="@+id/frame_container"
Android:layout_width="match_parent"
Android:layout_height="match_parent" />
<!-- Listview to display slider menu -->
<ListView
Android:id="@+id/list_slidermenu"
Android:layout_width="240dp"
Android:layout_height="match_parent"
Android:layout_gravity="right"
Android:choiceMode="singleChoice"
Android:divider="@color/list_divider"
Android:dividerHeight="1dp"
Android:listSelector="@drawable/list_selector"
Android:background="@color/list_background"/>
</Android.support.v4.widget.DrawerLayout>
ヘッダーを追加することで、このリストビューを好みに合わせてカスタマイズできます。ラジオボタン。
アクティビティを使用したAndroid Navigation Drawerの例に従いました: http://antonioleiva.com/navigation-view/
あなただけのカスタマイズが必要です:
public class MainActivity extends AppCompatActivity {
public static final String AVATAR_URL = "http://lorempixel.com/200/200/people/1/";
private DrawerLayout drawerLayout;
private View content;
private Toolbar toolbar;
private NavigationView navigationView;
private ActionBarDrawerToggle drawerToggle;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_dashboard);
toolbar = (Toolbar) findViewById(R.id.toolbar);
drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
initToolbar();
setupDrawerLayout();
content = findViewById(R.id.content);
drawerToggle = setupDrawerToggle();
final ImageView avatar = (ImageView) navigationView.getHeaderView(0).findViewById(R.id.avatar);
Picasso.with(this).load(AVATAR_URL).transform(new CircleTransform()).into(avatar);
}
private void initToolbar() {
final Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
final ActionBar actionBar = getSupportActionBar();
if (actionBar != null) {
actionBar.setHomeAsUpIndicator(R.drawable.ic_menu_black_24dp);
actionBar.setDisplayHomeAsUpEnabled(true);
}
}
private ActionBarDrawerToggle setupDrawerToggle() {
return new ActionBarDrawerToggle(this, drawerLayout, toolbar, R.string.drawer_open, R.string.drawer_close);
}
@Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
// Sync the toggle state after onRestoreInstanceState has occurred.
drawerToggle.syncState();
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
// Pass any configuration change to the drawer toggles
drawerToggle.onConfigurationChanged(newConfig);
}
private void setupDrawerLayout() {
drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
navigationView = (NavigationView) findViewById(R.id.navigation_view);
navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(MenuItem menuItem) {
int id = menuItem.getItemId();
switch (id) {
case R.id.drawer_home:
Intent i = new Intent(getApplicationContext(), MainActivity.class);
startActivity(i);
finish();
break;
case R.id.drawer_favorite:
Intent j = new Intent(getApplicationContext(), SecondActivity.class);
startActivity(j);
finish();
break;
}
return true;
}
});
} xmlレイアウトは次のとおりです
<Android.support.v4.widget.DrawerLayout
Android:id="@+id/drawer_layout"
xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto"
xmlns:tools="http://schemas.Android.com/tools"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:fitsSystemWindows="true"
tools:context=".MainActivity">
<FrameLayout
Android:id="@+id/content"
Android:layout_width="match_parent"
Android:layout_height="match_parent">
<Android.support.design.widget.AppBarLayout
Android:id="@+id/appBarLayout"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">
<Android.support.v7.widget.Toolbar
Android:id="@+id/toolbar"
Android:layout_width="match_parent"
Android:layout_height="?attr/actionBarSize"
Android:background="?attr/colorPrimary"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
app:layout_scrollFlags="scroll|enterAlways|snap" />
</Android.support.design.widget.AppBarLayout>
</FrameLayout>
<Android.support.design.widget.NavigationView
Android:id="@+id/navigation_view"
Android:layout_width="wrap_content"
Android:layout_height="match_parent"
Android:layout_gravity="start"
app:headerLayout="@layout/drawer_header"
app:menu="@menu/drawer"/>
メニューにdrawer.xmlを追加
<menu xmlns:Android="http://schemas.Android.com/apk/res/Android">
<group
Android:checkableBehavior="single">
<item
Android:id="@+id/drawer_home"
Android:checked="true"
Android:icon="@drawable/ic_home_black_24dp"
Android:title="@string/home"/>
<item
Android:id="@+id/drawer_favourite"
Android:icon="@drawable/ic_favorite_black_24dp"
Android:title="@string/favourite"/>
...
<item
Android:id="@+id/drawer_settings"
Android:icon="@drawable/ic_settings_black_24dp"
Android:title="@string/settings"/>
</group>
引き出しを開閉するには、string.xmlにこの値を追加します
<string name="drawer_open">Open</string>
<string name="drawer_close">Close</string>
引き出し.xml
enter code here
<ImageView
Android:id="@+id/avatar"
Android:layout_width="64dp"
Android:layout_height="64dp"
Android:layout_margin="@dimen/spacing_large"
Android:elevation="4dp"
tools:src="@drawable/ic_launcher"/>
<TextView
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_above="@+id/email"
Android:layout_marginLeft="@dimen/spacing_large"
Android:layout_marginStart="@dimen/spacing_large"
Android:text="Username"
Android:textAppearance="@style/TextAppearance.AppCompat.Body2"/>
<TextView
Android:id="@+id/email"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_alignParentBottom="true"
Android:layout_marginLeft="@dimen/spacing_large"
Android:layout_marginStart="@dimen/spacing_large"
Android:layout_marginBottom="@dimen/spacing_large"
Android:text="[email protected]"
Android:textAppearance="@style/TextAppearance.AppCompat.Body1"/>
Drawerでリストアイテムを分類するためにヘッダーを追加する必要があります
listView
をカスタマイズするか、expandableListView
を使用します
オプションの一部を選択するにはラジオボタンが必要です
NavigationDrawer
の現在の実装を変更せずにこれを行うことができます。listView
のカスタムアダプターを作成するだけです。親レイアウトをDrawer
として追加すると、その中に通常どおり複雑なレイアウトを作成できます。