SlidingPaneLayout
公式リファレンス: http://developer.android.com/reference/android/support/v4/widget/SlidingPaneLayout.html
android.support.v4.widgetにSlidingPaneLayoutっていうのが追加されていたのを今更知ったので検証してみた
検証アプリのキャプチャ
{% youtube iYnP1LvmHpk %}
構成
以前書いたSwipeRefreshLayout同様にgradle-android-toolkit(+Android Studio)でやるんだけど、android-support-v4なmaven packageは古い模様なのでAPIが入っていない模様。なので自前で持ってきて
dependencies {
compile files("libs/android-support-v4.jar")
}
辺りでビルドライブラリを追加するようにしておく
app/src/main/res/layout/activity_main.xml
<?xml version="1.0" ?>
<android.support.v4.widget.SlidingPaneLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/sliding_pane_layout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<fragment
android:name="sample.test.CategoryListFragment"
android:layout_width="280dp"
android:layout_height="match_parent"
android:layout_gravity="left" />
<fragment
android:name="sample.test.MainListFragment"
android:layout_width="300dp"
android:layout_height="match_parent"
android:layout_weight="1" />
</android.support.v4.widget.SlidingPaneLayout>
的な感じで左paneに持ってくるのを最初にビューに指定して、メインで表示させておくのをそのあとにビューを指定する。上記の場合だと左paneにCategoryListFragmentでメインにMainListFragmentを表示するようなUI構成を作っている
んまぁそこは/path/to/android_sdk/extras/android/support/samples/Support4Demos/res/layout/sliding_pane_layout.xmlに書いてあるので
あとそのビューに使っているFragmentに関してはAdapterをバインドしているだけなので省略する
MainActivity.java
package sample.test;
import android.os.Bundle;
import android.support.v4.widget.SlidingPaneLayout;
import android.util.Log;
import android.view.View;
import android.widget.Toast;
import com.actionbarsherlock.app.SherlockFragmentActivity;
public class MainActivity extends SherlockFragmentActivity {
private static final String TAG = MainActivity.class.getName();
SlidingPaneLayout mSlidingPaneLayout;
@Override
protected void onCreate(Bundle bundle) {
super.onCreate(bundle);
setContentView(R.layout.activity_main);
mSlidingPaneLayout = (SlidingPaneLayout)findViewById(R.id.sliding_pane_layout);
mSlidingPaneLayout.setPanelSlideListener(new MainSlidingPanelListener());
}
private class MainSlidingPanelListener extends SlidingPaneLayout.SimplePanelSlideListener {
@Override
public void onPanelOpened(View view) {
showToast("onPanelOpened");
}
@Override
public void onPanelClosed(View view) {
showToast("onPanelClosed");
}
}
private void showToast(String message) {
Toast.makeText(this, message, Toast.LENGTH_LONG).show();
}
}
Listenerを使って開いたか閉じたかのイベントをキャッチ出来る模様。ちなみに上記動画でも発生しているけど、左paneをオープンした状態でスライドして閉じるのではなくメインpaneなところをタップして閉じようとするとonPanelOpened/onPanelClosedの両方なイベントが発生している模様なので開く際になんかする際は要注意かも知れないと
んまぁ今までだとSlidingMenu?とかそういう系のUIライブラリがあった訳だけど、android-support-v4辺りにそういうのをサポートするのも登場してきているのでこれも採用ありかも知れないっていう検討な候補としてありなのではないかと