web-dev-qa-db-ja.com

Androidすべての上にビューをオーバーレイしますか?

Androidのすべての上にビューを重ねることができますか?

IPhoneでは、新しいビューのframe.Originを(0,0)に設定し、幅と高さをself.viewの幅と高さに設定します。これをself.viewに追加すると、オーバーレイとして機能し、背後のコンテンツをカバーします(または透明な背景があり、背後にビューが表示されている場合)。

アンドロイドに同様の手法がありますか?ビューはわずかに異なることを認識しています(3つのタイプ(またはそれ以上...)relativelayout、linearlayout、framelayoutがあります)が、すべてを無差別にビューにオーバーレイする方法はありますか?

69
Thomas Clayson

単にRelativeLayoutまたはFrameLayoutを使用してください。最後の子ビューは他のすべてをオーバーレイします。

Androidは、Cocoa Touch SDKがサポートしていないパターンをサポートしています:レイアウト管理。
Layoutは、iPhoneのすべてを絶対位置に配置することを意味します(いくつかのストレッチ要因を除く)。 Androidのレイアウトは、子が互いに関連して配置されることを意味します。

例(2番目のEditTextは最初のEditTextを完全にカバーします):

<FrameLayout
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:orientation="vertical"
    Android:layout_width="fill_parent"
    Android:layout_height="fill_parent"
    Android:id="@+id/root_view">

    <EditText
        Android:layout_width="fill_parent"
        Android:id="@+id/editText1"
        Android:layout_height="fill_parent">
    </EditText>

    <EditText
        Android:layout_width="fill_parent"
        Android:id="@+id/editText2"
        Android:layout_height="fill_parent">
        <requestFocus></requestFocus>
    </EditText>

</FrameLayout>

FrameLayoutは、ある種のビュースタックです。特殊なケース用に作られています。

RelativeLayoutは非常に強力です。 ビューAは親レイアウトを下に揃える必要がありますビューBはAを下から上に揃える必要がありますなど

コメントに基づいて更新

通常、コンテンツはonCreatesetContentView(R.layout.your_layout)で設定します(レイアウトが自動的に拡張されます)。それを手動で行い、setContentView(inflatedView)を呼び出すことができますが、違いはありません。

ビュー自体は、単一のビュー(TextViewなど)または複雑なレイアウト階層(すべてのレイアウトがビュー自体であるため、ネストされたレイアウト)である場合があります。

setContentViewを呼び出した後、アクティビティはそのコンテンツがどのように見えるかを知っており、(FrameLayout) findViewById(R.id.root_view)を使用してこの階層内のビューを取得できます(一般パターン(ClassOfTheViewWithThisId) findViewById(R.id.declared_id_of_view))。

95
Knickedi
<FrameLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:id="@+id/root_view"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent"
Android:orientation="vertical" >

<LinearLayout
    Android:id = "@+id/Everything"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:orientation="vertical" >
    <!-- other actual layout stuff here EVERYTHING HERE -->

   </LinearLayout>

<LinearLayout
    Android:id="@+id/overlay"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:layout_gravity="right" >
</LinearLayout>

これで、Android:id = "@+id/overlay"でLinearLayoutの下に追加したビューは、Android:id="@+id/Everything"で線形レイアウトにgravity = rightでオーバーレイとして表示されます

15
Dilroop Singh

bringToFrontを使用できます:

    View view=findViewById(R.id.btnStartGame);
    view.bringToFront();
9
Ahmad Aghazadeh

最善の方法は ViewOverlay です。Android JellyBeanMR2(Api 18)以降、オーバーレイとしてドロアブルをオーバーレイとして任意のビューに追加できます。

mMyDrawableにオーバーレイとしてmMyViewを追加します。

mMyDrawable.setBounds(0, 0, mMyView.getMeasuredWidth(), mMyView.getMeasuredHeight())
mMyView.getOverlay().add(mMyDrawable)
7
Jacks Gong

私は以前にオーサーを試しましたが、これはうまくいきませんでした。私はjsutがTextureViewの代わりにLinearLayoutを使用しましたが、現在は問題なく動作しています。同じ問題を抱えている他の人の助けになることを願っています。 :)

    view = (LinearLayout) findViewById(R.id.view); //this is initialized in the constructor
    openWindowOnButtonClick();

public void openWindowOnButtonClick()
{
    view.setAlpha((float)0.5);
    FloatingActionButton fb = (FloatingActionButton) findViewById(R.id.floatingActionButton);
    final InputMethodManager keyboard = (InputMethodManager) getSystemService(getBaseContext().INPUT_METHOD_SERVICE);
    fb.setOnClickListener(new View.OnClickListener()
    {
        @Override
        public void onClick(View v)
        {
            // check if the Overlay should be visible. If this value is false, it is not shown -> show it.
            if(view.getVisibility() == View.INVISIBLE)
            {
                view.setVisibility(View.VISIBLE);
                keyboard.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0);
                Log.d("Overlay", "Klick");
            }
            else if(view.getVisibility() == View.VISIBLE)
            {
                view.setVisibility(View.INVISIBLE);
                keyboard.toggleSoftInput(0, InputMethodManager.HIDE_IMPLICIT_ONLY);
            }
0
HaxnHarald