BottomSheetを作るためのライブラリについてメモ
現在、公式のサポートライブラリに無いマテリアルデザインのコンポーネントで、BottomSheetというものがあります。
下からすっと選択肢が出てくるシートですね。
DIalog用のActivityやFragmentをいじってごにょごにょとね...とか、時間があればやってみたいのですが、 直近ではそこで独自に実装頑張るくらいなら先に何とかしたい箇所があるので、 ライブラリを探してみて二つ試してみました。
こちらは、一覧の一番上だけタイトルみたいにつけられればいい、みたいな場合とか、グリッド上に表示したいとか比較的デフォルトに近い実装したいときにとても簡単に出来るみたいです。
Dialogにタイトルを入れて、いくつか選択肢を入れてみたときのコードが下記で、その下においたアニメのような感じで動きます。
// build.gradle dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) compile 'com.android.support:appcompat-v7:23.1.1' compile 'com.android.support:design:23.1.1' compile 'com.cocosw:bottomsheet:1.+@aar' }
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); fab.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { new BottomSheet.Builder(MainActivity.this).title("title").sheet(R.menu.menu_sheet).listener(new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { switch (which) { case R.id.help: Toast.makeText(MainActivity.this, "Help me!", Toast.LENGTH_SHORT).show(); break; } } }).show(); } }); // 以下略
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/share" android:title="@string/share" android:icon="@android:drawable/ic_menu_share"/> <item android:id="@+id/upload" android:title="@string/upload" android:icon="@android:drawable/ic_menu_week"/> <item android:id="@+id/call" android:title="@string/call" android:icon="@android:drawable/ic_menu_call"/> <group android:id="@+id/helpgroup"> <item android:id="@+id/test" android:title="withoutIcon" android:enabled="false"/> <item android:id="@+id/help" android:title="@string/help" android:icon="@android:drawable/ic_menu_help"/> </group> </menu>
もう1つはこちら。こちらは、ただの一覧等を表示する場合は1つめより手間がかかります。 しかし、表示するシートにそのままカスタムレイアウトを指定できたり、閉じたり開いたり限界まで開いたり、とAPIが充実している印象で、少し何かいじる必要があるときに手が出しやすそうでした。
ためしに、ボタンの一覧をだーっと表示させてみたときのコードとそのときの様子を出します。
// build.gradle dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) compile 'com.android.support:appcompat-v7:23.1.1' compile 'com.android.support:design:23.1.1' compile 'com.flipboard:bottomsheet-core:1.5.0' compile 'com.flipboard:bottomsheet-commons:1.5.0' // optionald }
public class MainActivity extends AppCompatActivity { private BottomSheetLayout bottomSheet; private Button bottomSheetButton1; private Button bottomSheetButton2; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); bottomSheet = (BottomSheetLayout) findViewById(R.id.bottomsheet); FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); fab.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { bottomSheet.showWithSheetView(LayoutInflater.from(MainActivity.this) .inflate(R.layout.sheet, bottomSheet, false)); // 一部のボタンにクリックイベントを設定してみる bottomSheetButton1 = (Button) bottomSheet.findViewById(R.id.sheetButton1); bottomSheetButton2 = (Button) bottomSheet.findViewById(R.id.sheetButton2); bottomSheetButton1.setOnClickListener( new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this, "Button 1", Toast.LENGTH_SHORT).show(); } } ); bottomSheetButton2.setOnClickListener( new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this, "Button 2", Toast.LENGTH_SHORT).show(); } } ); bottomSheet.addOnSheetDismissedListener(new OnSheetDismissedListener() { @Override public void onDismissed(BottomSheetLayout bottomSheetLayout) { bottomSheetButton1.setOnClickListener(null); bottomSheetButton2.setOnClickListener(null); } }); } }); // 以下略
<!-- BottomSheetを表示したい(BottomSheetの下に表示させたい)ActivityやFragmentのレイアウトを BottomSheetLayoutで包む必要があります --> <?xml version="1.0" encoding="utf-8"?> <com.flipboard.bottomsheet.BottomSheetLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" xmlns:app="http://schemas.android.com/apk/res-auto" app:layout_behavior="@string/appbar_scrolling_view_behavior" android:id="@+id/bottomsheet" android:layout_width="match_parent" android:layout_height="match_parent" tools:showIn="@layout/activity_main" tools:context="com.example.woshidan.bottomsheet.MainActivity"> <android.support.design.widget.CoordinatorLayout android:layout_width="match_parent" android:layout_height="match_parent"> <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" > <TextView android:text="Hello World!" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </RelativeLayout> <android.support.design.widget.FloatingActionButton android:id="@+id/fab" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="bottom|end" android:layout_margin="@dimen/fab_margin" android:src="@android:drawable/ic_dialog_email" /> </android.support.design.widget.CoordinatorLayout> </com.flipboard.bottomsheet.BottomSheetLayout>
<!-- BottomSheetの中身に指定したカスタムレイアウト. シートが分かりやすいように 背景色を水色に指定しています --> <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/root" android:background="@android:color/holo_blue_bright" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="wrap_content"> <android.support.v7.widget.AppCompatButton android:id="@+id/sheetButton1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Button1"/> <android.support.v7.widget.AppCompatButton android:id="@+id/sheetButton2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Button2"/> <android.support.v7.widget.AppCompatButton android:id="@+id/sheetButton3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Button3"/> <android.support.v7.widget.AppCompatButton android:id="@+id/sheetButton4" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Button4"/> <android.support.v7.widget.AppCompatButton android:id="@+id/sheetButton5" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Button5"/> <android.support.v7.widget.AppCompatButton android:id="@+id/sheetButton6" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Button6"/> <android.support.v7.widget.AppCompatButton android:id="@+id/sheetButton7" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Button7"/> <android.support.v7.widget.AppCompatButton android:id="@+id/sheetButton8" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Button8"/> </LinearLayout>