【自己紹介】
はじめまして。「えんた」こと、遠藤拓也といいます。
岩手県立大学の2年で、普段は小・中・高生にプログラミングを教えたり、
AndroidアプリやWebサービスの開発を勉強していたりします。
イトナブ開発合宿はとても和やかな感じで開発ができて、分からない所や参考になりそうな
ところを教えてくださったり、ハッカソンとは違い徹夜して切羽詰まり…ということなく、
自分のペースで開発を進めていくことが出来ました。
【開発テーマ】
Android 5.0から使えるようになった、Toolbarとそのまわりをいじってみようと思います!
【Toolbarとは?】
Android 5.0 (Lollipop)と同時に追加されたActionBarの代替となるものです。
ビュー階層内に記述するため、他のビューとの共存や、アニメーション、スクロールイベントへの反応などが簡単にでき、
Activity の Action Bar として設定することもできるので、通常のオプション メニューのアクションをその内部に表示させることも可能です。
【開発環境】
・Mac OS X (10.10.2)
・Android Studio(1.0.1)
・Android(5.0.1)
【試してみたこと】
・Toolbar
・Tab(Actionbar.Tabが非推奨になったため)
・Navigation Drawer
【準備】
build.gradle(Module: app)
忘れないように、最初に追加しておきましょう。
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
// Toolbarを使うために必要
compile 'com.android.support:appcompat-v7:21.0.0'
// PagerSlidingTabStripを使うのに必要
compile 'com.jpardogo.materialtabstrip:library:1.0.6'
}
================================================================================
styles.xml(v21)
Toolbarの色やステータスバーの色などはここで指定します。
parentはTheme.AppCompat…を使う必要があるみたいです。
<? xml version = "1.0" encoding = "utf-8" ?> < resources > < style name = "AppTheme" parent = "Theme.AppCompat.Light.NoActionBar" > <!-- Customize your theme here. --> <!-- Toolbarの背景色 --> < item name = "colorPrimary" >#FFBB33</ item > <!-- ステータスバーの背景色 --> < item name = "colorPrimaryDark" >#FFFF8800</ item > <!-- ActionModeを使うのに必要 --> < item name = "windowActionModeOverlay" >true</ item > </ style > </ resources > |
================================================================================
activity_main.xml
メインのレイアウト部分です。
<!-- Drawer start-->
<
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"
>
android:layout_width
=
"match_parent"
android:layout_height
=
"match_parent"
android:padding
=
"0dp"
android:paddingBottom
=
"@dimen/activity_vertical_margin"
android:paddingLeft
=
"@dimen/activity_horizontal_margin"
android:paddingRight
=
"@dimen/activity_horizontal_margin"
android:paddingTop
=
"@dimen/activity_vertical_margin"
tools:context
=
".MainActivity"
>
<!-- Tab -->
<
com.astuetz.PagerSlidingTabStrip
android:id
=
"@+id/tabs"
android:layout_width
=
"match_parent"
android:layout_height
=
"48dp"
android:layout_alignParentStart
=
"true"
android:layout_below
=
"@+id/tool_bar"
android:background
=
"?attr/colorPrimary"
/>
android:id
=
"@+id/pager"
android:layout_width
=
"match_parent"
android:layout_height
=
"match_parent"
android:layout_alignParentEnd
=
"false"
android:layout_alignParentStart
=
"false"
android:layout_below
=
"@+id/tool_bar"
android:focusable
=
"false"
android:nestedScrollingEnabled
=
"false"
android:outlineProvider
=
"paddedBounds"
>
<
android.support.v4.view.PagerTabStrip
android:id
=
"@+id/strip"
android:layout_width
=
"match_parent"
android:layout_height
=
"wrap_content"
android:background
=
"#FFBB33"
android:focusable
=
"false"
android:paddingBottom
=
"12dp"
android:paddingEnd
=
"15dp"
android:paddingStart
=
"15dp"
android:paddingTop
=
"12dp"
android:textColor
=
"#000"
android:touchscreenBlocksFocus
=
"true"
/>
</
android.support.v4.view.ViewPager
>
<!-- ToolBar start -->
<
android.support.v7.widget.Toolbar
android:id
=
"@+id/tool_bar"
android:layout_width
=
"match_parent"
android:layout_height
=
"wrap_content"
android:layout_alignParentLeft
=
"true"
android:layout_alignParentStart
=
"true"
android:layout_alignParentTop
=
"true"
android:background
=
"?attr/colorPrimary"
android:minHeight
=
"?attr/actionBarSize"
app:theme
=
"@style/ThemeOverlay.AppCompat.ActionBar"
>
</
android.support.v7.widget.Toolbar
>
<!-- ToolBar end -->
</
RelativeLayout
>
<!-- Drawer 表示部分 -->
<
LinearLayout
android:layout_width
=
"280dp"
android:layout_height
=
"match_parent"
android:layout_gravity
=
"start"
android:background
=
"#fff"
>
<
ListView
android:id
=
"@+id/listview"
android:layout_width
=
"fill_parent"
android:layout_height
=
"match_parent"
/>
</
LinearLayout
>
<!-- Drawer 表示部分 end -->
</
android.support.v4.widget.DrawerLayout
>
<!-- Drawer end-->
※
?attrはstyles.xmlで付けた名前を使用しますよって意味
================================================================================
menu_main.xml
Toolbar右に表示されているメニューボタンです
tools:context = ".MainActivity" > < item android:id = "@+id/mbtn" android:title = "menu-button" android:icon = "@drawable/ic_launcher2” //顔マーク android:orderInCategory = "100" app:showAsAction = "ifRoom" /> </ menu > |
================================================================================
activity_fragment(0〜2).xml
Tabで管理される画面です。今回は同様の画面を3つ用意しましした。
< LinearLayout android:layout_width = "match_parent" android:layout_height = "match_parent" > < TextView android:layout_width = "match_parent" android:layout_height = "wrap_content" android:text = "グー" android:textSize = "30sp" android:padding = "50dp" android:layout_gravity = "center_vertical" android:gravity = "center" /> </ LinearLayout > |
================================================================================
MainActivity.java
メイン部分です。
public
class
MainActivity
extends
ActionBarActivity {
private
DrawerLayout vDrawerLayout;
private
ActionBarDrawerToggle vDrawerToggle;
private
ListView vListView;
@Override
protected
void
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
settoolbar();
PagerSlidingTabStrip tabs = (PagerSlidingTabStrip) findViewById(R.id.tabs);
ViewPager mViewPager = (ViewPager) findViewById(R.id.pager);
mViewPager.setAdapter(
new
MyFragmentStatePagerAdapter(getSupportFragmentManager()));
tabs.setViewPager(mViewPager);
PagerTabStrip strip = (PagerTabStrip)findViewById(R.id.strip);
strip.setTextSize(TypedValue.COMPLEX_UNIT_SP,
20
);
vDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
initDrawer();
vListView = (ListView) findViewById(R.id.listview);
vListView.setAdapter(
new
ArrayAdapter<String>(
this
, android.R.layout.simple_list_item_1,
new
String[]{
"menu 1"
,
"menu 2"
,
"menu 3"
,
"menu 4"
,
"menu 5"
}));
}
protected
void
settoolbar(){
// toolbar定義
Toolbar toolbar = (Toolbar) findViewById(R.id.tool_bar);
// タイトル
toolbar.setTitle(
"ActionBar Title"
);
// タイトルの色
toolbar.setTitleTextColor(Color.parseColor(
"#000000"
));
// ActionBarと同等にToolbarを使う
setSupportActionBar(toolbar);
}
private
void
initDrawer() {
vDrawerToggle =
new
ActionBarDrawerToggle(
this
, vDrawerLayout, R.string.app_name, R.string.app_name);
vDrawerToggle.setDrawerIndicatorEnabled(
true
);
vDrawerLayout.setDrawerListener(vDrawerToggle);
getSupportActionBar().setDisplayHomeAsUpEnabled(
true
);
getSupportActionBar().setDisplayShowHomeEnabled(
true
);
}
@Override
public
boolean
onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_main, menu);
return
true
;
}
@Override
public
boolean
onOptionsItemSelected(MenuItem item) {
int
id = item.getItemId();
if
(id == R.id.mbtn) {
Toast.makeText(MainActivity.
this
,
"Menu click"
, Toast.LENGTH_SHORT).show();
return
true
;
}
return
vDrawerToggle.onOptionsItemSelected(item) ||
super
.onOptionsItemSelected(item);
}
@Override
protected
void
onPostCreate(Bundle savedInstanceState) {
super
.onPostCreate(savedInstanceState);
vDrawerToggle.syncState();
}
@Override
public
void
onConfigurationChanged(Configuration newConfig) {
super
.onConfigurationChanged(newConfig);
vDrawerToggle.onConfigurationChanged(newConfig);
}
}
================================================================================
MyFragmentStatePagerAdapter.java
FragmentStatePagerAdapterでFragmentを管理します。
public class MyFragmentStatePagerAdapter extends FragmentStatePagerAdapter { public MyFragmentStatePagerAdapter(FragmentManager fm) { super (fm); } @Override public Fragment getItem( int i) { switch (i){ case 0 : return new Fragment0(); case 1 : return new Fragment1(); default : return new Fragment2(); } } @Override public int getCount() { return 3 ; } @Override public CharSequence getPageTitle( int position) { switch (position){ case 0 : return "First" ; case 1 : return "Second" ; default : return "Third" ; } } } |
================================================================================
Fragment(0〜2)
.java
Tabでスワイプして表示させる画面です。
public
class
Fragment0
extends
Fragment {
@Override
public
View onCreateView(LayoutInflater inflater,
ViewGroup container,
Bundle savedInstanceState) {
return
inflater.inflate(R.layout.activity_fragment0,
null
);
}
@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
;
}
return
super
.onOptionsItemSelected(item);
}
}
長くなりましたが、これで
Toolbar、Tab、Navigation Drawerが実装出来たと思います。
【可能性】
ちょっと調べただけでもたくさんのサンプルが出てきました。
xmlでレイアウトを組むことが好きな私にとってはとても
使いやすいという印象がありました。
Actionbarの代わりとして扱え、さらにサイズや位置も自由に変えられるため、
Actionbar以外の使い道もアイディア次第になりそうです。
ただ、
setSupportActionBarすると
setNavigationOnClickListenerやsetOnMenuItemClickListenerは
使えなくなるので注意。
【最後に】
普段は調べる→コピペ→動けばOK、という感じでしたが、
今回は『狭く、深く』ということだったので公式リファレンスを見たり、
実際にいろいろ試してみたり、英語とも格闘しました。すると、
点と点が繋がったようなことがあったり、今後の開発に活かせそうなことも
発見出来たりと、とても充実した時間を過ごすことができました。
今後も新しいことにどんどんチャレンジしていきたいと思います。
【Github】
コピペの量が多すぎ!って人はこちらをどうぞ
【参考】
Google Japan Developer Relations Blog
AndroidのToolBar(新しいActionBar)メモ
0 件のコメント:
コメントを投稿