各アクティビティの上部にナビゲーション バーを配置したいと思います (参照: スクリーンショット)。ナビゲーション バーには、2 つのボタン (前と次のアクティビティ) とアクティビティ インジケーターが必要です。SOでいくつかのソリューションを見てきました(インクルード、フラグメント、アクションバーを使用)が、どれが最適か、または誰かが別のオプションを持っているでしょうか?
3 に答える
CommonswareとMartinSVKの両方に同意します。http://code.google.com/p/sherlock-demo/でコード サンプルを試してみることをお勧めします。前述のポスターの両方が言及しているように、ViewPager を使用して、フラグメント間で水平にスワイプできるようにします。ただし、最初に要求したように、画面の上部に視覚的な表示を提供するタブ ナビゲーションも使用します。Android UI の作成に関するアイデアについては、http://developer.android.com/design を参照してください。
この機能はViewPagerクラスによって提供されます。アクティビティの代わりにフラグメントを提供すると、提供されたビュー間ですばやく効率的に水平スクロールできます。アクティビティを 1 つだけ使用するため、ナビゲーション バーは常に表示されます。変更される唯一の部分は、ViewPager のページです。
ナビゲーション バーに関しては、いくつかのオプションがあります。ビューの独自の実装を提供できますが、ViewPager の現在のページを設定するページを変更するためのリスナーを作成する必要があります。これは最も複雑な方法です。
別の解決策は、多くの点で役立つActionBarSherlockを使用することです。そこで、アクション バーのナビゲーションを ViewPager に接続できます。このソリューションは、最も単純で堅牢です。Google IOアプリで、それがどのように行われたかを確認できます。家庭での活動は、あなたが見るべきものです。このソリューションの問題は、ナビゲーターの定義済みビューが表示されることです。
おそらく最後の解決策は、Page Indicatorを試してみることです。これにより、ナビゲーションバーの実装が簡素化されます。
ここに記載されているものはすべて ViewPager の上にあるので、必ずそれを使用してください。私は他のより良い解決策を知りません。問題は、ナビゲーションをどのように実装したいかです。
私の選択は、共有アクティビティ クラス (たとえば BaseActivity) を作成し、基本的なレイアウトを設定する onCreate メソッドをオーバーライドすることです。子クラスは setContentView の setContent インスタンスを使用する必要があります
public class BaseActivity extends Activity {
private LayoutInflater mInflater;
@Override
public void onCreate(Bundle b) {
super.onCreate(b);
setContentView(R.layout.base);
}
public void setContent(View content) {
setContentPart(R.id.baseContentContainer, content);
}
public void setContent(int contentLayoutId) {
setContentPart(R.id.baseContentContainer, contentLayoutId);
}
private void setContentPart(int containerId, int layoutId) {
final LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
setContentPart(containerId, inflater.inflate(layoutId, null));
}
private void setContentPart(int containerId, View view) {
final ViewGroup vg = (ViewGroup) findViewById(containerId);
vg.setVisibility(view != null ? View.VISIBLE : View.GONE);
vg.removeAllViews();
if (view != null) vg.addView(view, layoutFillParent);
}
public LayoutInflater getLayoutInflater() {
if (mInflater == null) mInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
return mInflater;
}
}