多くのアクティビティを含むアプリケーションを開発していますが、スライドドロワーは画面の下部にあり、メニューボタンが含まれているため、スライドドロワーを使用して独自のメニューを作成しました(組み込みのメニューボタンは使用したくない)。
私が必要としているのは、そのスライド式引き出しを私のすべての活動に表示させることです
アクティビティを作成し、そのコンテンツビューをドロワーを含むxmlファイルに設定してから、そのアクティビティを他のすべてのアクティビティに拡張しようとしましたが、このソリューションは機能しません
だから何か提案はありますか?
拡張は正しい方法です。 setContentViewを正しい方法でオーバーライドするだけです。これが実際の例ですが、ドロワーの代わりに、作成したカスタムタブバーを使用します。
次のように、引き出しを使用してレイアウトを定義します。
これは act_layout.xml
<LinearLayout
...
Android:orientation="vertical"
>
<YourDrawer
...
/>
<FrameLayout
Android:id="@+id/act_content"
...
>
// Here will be all activity content placed
</FrameLayout>
</LinearLayout>
これは、act_contentフレームに他のすべてのレイアウトを含めるための基本レイアウトになります。次に、基本アクティビティクラスを作成し、次の手順を実行します。
public abstract class DrawerActivity extends Activity {
protected LinearLayout fullLayout;
protected FrameLayout actContent;
@Override
public void setContentView(final int layoutResID) {
// Your base layout here
fullLayout= (LinearLayout) getLayoutInflater().inflate(R.layout.act_layout, null);
actContent= (FrameLayout) fullLayout.findViewById(R.id.act_content);
// Setting the content of layout your provided to the act_content frame
getLayoutInflater().inflate(layoutResID, actContent, true);
super.setContentView(fullLayout);
// here you can get your drawer buttons and define how they
// should behave and what must they do, so you won't be
// needing to repeat it in every activity class
}
}
基本的に、setContentView(int resId)へのすべての呼び出しをインターセプトし、xmlからドロワーのレイアウトを拡張し、アクティビティのレイアウトを(メソッド呼び出しで提供されるreIdによって)拡張し、必要に応じてそれらを結合し、のcontentViewとして設定します。アクティビティ。
EDIT:上記のものを作成したら、通常どおりアプリの作成に進み、レイアウトを作成し(ドロワーについては言及せずに)アクティビティを作成しますが、単純なアクティビティを拡張する代わりに、DrawerActivityを拡張します。そのようです:
public abstract class SomeActivity extends DrawerActivity {
protected void onCreate(Bundle bundle) {
setContentView(R.layout.some_layout);
}
}
何が起こるかというと、setContentView(R.layout.some_layout)がインターセプトされます。 DrawerActivityは、xmlから指定したレイアウトをロードし、ドロワーの標準レイアウトをロードし、それらを組み合わせて、アクティビティのcontentViewとして設定します。
最後に3年後、Orlov氏の回答に完全に導かれなかった可能性のあるこの重要な質問に対する完全な解決策がここにあります。
階層ビューを作成する彼の方法は完全にOKでしたが、初心者の開発者を誤解させる可能性のある小さな間違いがいくつかありました。
したがって、100%機能する解決策は次のようになります。
activity_drawer.xml
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="match_parent" >
<FrameLayout
Android:id="@+id/drawer_frame"
Android:layout_width="match_parent"
Android:layout_height="match_parent" />
<YourDrawer
Android:id="@+id/drawer_drawer"
Android:layout_width="match_parent"
Android:layout_height="fill_parent" >
</YourDrawer>
</RelativeLayout>
DrawerActivity.Java
public class DrawerActivity extends Activity {
protected RelativeLayout fullLayout;
protected FrameLayout frameLayout;
@Override
public void setContentView(int layoutResID) {
fullLayout = (RelativeLayout) getLayoutInflater().inflate(R.layout.activity_drawer, null);
frameLayout = (FrameLayout) fullLayout.findViewById(R.id.drawer_frame);
getLayoutInflater().inflate(layoutResID, frameLayout, true);
super.setContentView(fullLayout);
//Your drawer content...
}
}
MainActivity.Java
public class MainActivity extends DrawerActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
マニフェストでDrawerActivityを宣言することを忘れないでください。
お役に立てば幸いです。
これは2年遅れていることは知っていますが、ここで答えを求めている人にとってはそうです。 Orlov氏は適切な対応をしましたが、わずかな調整が必要でした。
また:スライディングドロワーをレイアウトの上に表示したい場合は(そうです!)、slidingDrawerの後にあるframeLayoutをslidingDrawerの前に配置します。