web-dev-qa-db-ja.com

スライド式引き出しはすべてのアクティビティに表示されます

多くのアクティビティを含むアプリケーションを開発していますが、スライドドロワーは画面の下部にあり、メニューボタンが含まれているため、スライドドロワーを使用して独自のメニューを作成しました(組み込みのメニューボタンは使用したくない)。

私が必要としているのは、そのスライド式引き出しを私のすべての活動に表示させることです

アクティビティを作成し、そのコンテンツビューをドロワーを含むxmlファイルに設定してから、そのアクティビティを他のすべてのアクティビティに拡張しようとしましたが、このソリューションは機能しません

だから何か提案はありますか?

18
Zak

拡張は正しい方法です。 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として設定します。

41
Alex Orlov

最後に3年後、Orlov氏の回答に完全に導かれなかった可能性のあるこの重要な質問に対する完全な解決策がここにあります。

階層ビューを作成する彼の方法は完全にOKでしたが、初心者の開発者を誤解させる可能性のある小さな間違いがいくつかありました。

  1. Gabeも述べたように、宣言で抽象を取り除くことができます。
  2. 両方の子をFrameLayoutでラップする必要はありません。親はRelativeLayout、LinearLayoutなど、何でもかまいません。ただし、最も重要な部分は、Sliderの前にFrameLayoutを宣言する必要があることです。

したがって、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を宣言することを忘れないでください。

お役に立てば幸いです。

13
The Great MA

これは2年遅れていることは知っていますが、ここで答えを求めている人にとってはそうです。 Orlov氏は適切な対応をしましたが、わずかな調整が必要でした。

  • 公開後に要約を削除します。 (これがエラーの原因です)
  • スライドドロワーとFrameLayoutの両方を別のFrameLayoutでラップし、幅と高さをmatch_parentに設定します。 (これにより、両方のレイアウトを表示できます)。

また:スライディングドロワーをレイアウトの上に表示したい場合は(そうです!)、slidingDrawerの後にあるframeLayoutをslidingDrawerの前に配置します。

2
Gabe