API 21: Android 5.0 (Lollipop) で NavigationDrawer と Toolbar を実装する
Android アプリの開発って、Support Library を使ったり使わなかったり、同じことを実現するにも手段が色々ありすぎて混乱します。 とりあえず API 21: Android 5.0 (Lollipop) でそれっぽい画面が出来たので、実装の 1 パターンを貼っておきたいと思います。
activity_main.xml
<?xml version=“1.0” encoding=“utf-8”?>
<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_width=“match_parent” android:layout_height=“match_parent”>
<!-- Toolbar のレイアウト崩れを防ぐために Toolbar を囲う -->
<RelativeLayout
android:layout_height="match_parent"
android:layout_width="match_parent">
<Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="?android:actionBarSize"
android:background="?android:colorPrimary"/>
</RelativeLayout>
<!-- Fragment 用コンテナ -->
<FrameLayout
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
<!-- NavigationDrawer -->
<android.support.design.widget.NavigationView
android:id="@+id/navigation_view"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
android:background="@android:color/white"
app:headerLayout="@layout/navigation_header"
app:menu="@menu/menu_navigation"
app:itemBackground="@android:color/transparent"/>
</android.support.v4.widget.DrawerLayout>
styles.xml
<?xml version=“1.0” encoding=“utf-8”?>
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<!-- Customize your theme here. -->
</style>
navigation_header.xml
<?xml version=“1.0” encoding=“utf-8”?>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="New Text"/>
menu_navigation.xml
<?xml version=“1.0” encoding=“utf-8”?>
MainActivity.java
package org.ahiufomasao.android.activities;
import android.app.ActionBar; import android.app.Activity; import android.content.res.Configuration; import android.os.Bundle; import android.support.v4.widget.DrawerLayout; import android.support.v7.app.ActionBarDrawerToggle; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.Toolbar;
import org.ahiufomasao.android.R;
/* * 最初に起動する Activity / public class MainActivity extends Activity { // NavigationDrawer に合わせて Toolbar のアイコンを切り替えるためのしかけ ActionBarDrawerToggle mActionBarDrawerToggle;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Toolbar を使えるようにする
setActionBar((Toolbar)findViewById(R.id.toolbar));
DrawerLayout drawerLayout = (DrawerLayout)findViewById(R.id.drawer_layout);
ActionBar actionBar = getActionBar();
// NavigationDrawer に合わせて Toolbar のアイコンを切り替えるためのしかけ
mActionBarDrawerToggle = new ActionBarDrawerToggle(
this,
drawerLayout,
R.string.app_name,
R.string.app_name
) {
public void onDrawerOpened(View drawerView) {}
public void onDrawerClosed(View view) {}
};
// ??
mActionBarDrawerToggle.setDrawerIndicatorEnabled(true);
// NavigationDrawer とアイコン切り替えのしかけを関連付け
drawerLayout.setDrawerListener(mActionBarDrawerToggle);
// ??
actionBar.setDisplayHomeAsUpEnabled(true);
// ??
actionBar.setDisplayShowHomeEnabled(true);
/*
FragmentManager fragmentManager = getFragmentManager();
fragmentManager.beginTransaction()
.replace(R.id.container, HomeFragment.newInstance())
.commit();
*/
}
@Override
protected void onPostCreate(Bundle savedInstanceState)
{
super.onPostCreate(savedInstanceState);
// Sync the toggle state after onRestoreInstanceState has occurred.(アイコンのしかけの状態を同期)
mActionBarDrawerToggle.syncState();
}
@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)
{
// ??
if (mActionBarDrawerToggle.onOptionsItemSelected(item))
{
return true;
}
// 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;
}
return super.onOptionsItemSelected(item);
}
@Override
public void onConfigurationChanged(Configuration newConfig)
{
super.onConfigurationChanged(newConfig);
// Pass any configuration change to the drawer toggle(設定の変化の同期)
mActionBarDrawerToggle.onConfigurationChanged(newConfig);
}
}
[caption id=“attachment_2680” align=“alignnone” width=“616”] 実行結果[/caption]
[caption id=“attachment_2681” align=“alignnone” width=“617”] 実行結果(NavigationDrawer を開いた所)[/caption]
それっぽくなった!!!!