web-dev-qa-db-ja.com

ビューを後ろに送る方法は?プログラムでzオーダーを制御する方法は?

ビューを戻すのに問題があります。 Android=には、ビューを別のビューの上に配置するbringToFront()などのメソッドがあります。そのように、前の画像の下にビューを配置します。

AndroidにはsendToBack()bringToBack()などのメソッドがありますか?もしそうなら、誰でもこれで私を助けることができます。

注:レイアウトにアイテムを配置する順序によってzオーダーを制御したくないので、zオーダーをプログラムで制御したいです。

前面のビューを非表示にするのではなく、移動するビューの背後に表示するだけです。

54
Lukap

Afaikには、このための組み込みソリューションはありません。 FrameLayoutのzオーダーなどを変更しようとしていると思います。

ただし、レイアウトに含まれる子要素の順序を変更できると思います。 RemoveChild ...()およびaddView()メソッドは位置の値を取ることができるため、子要素を交換する可能性が高く、それによってzオーダーが変更されます。しかし、それは少しハッキーな解決策のようです。

または、子ビューの可視性プロパティを変更することを検討してください。同様の動作が得られる場合がありますが、それは私が考えるよりずっときれいになるでしょう。

編集:

新しいバージョンAndroid=、L Developer Previewでは、ようやくビューのZ順序を簡単に変更できるようになりました。 https://developer.Android.com/preview/material/views-shadows.html

32

私はこれが他の回答で暗示されていることを理解していますが、誰もコードを投稿していません。ビューを処理するための「ヘルパー」関数があるユーティリティクラスに以下を保持します。

public static void sendViewToBack(final View child) {
    final ViewGroup parent = (ViewGroup)child.getParent();
    if (null != parent) {
        parent.removeView(child);
        parent.addView(child, 0);
    }
}
62
Turix

sendToBack()メソッドはありません。しかし、下のビューでbringToFront()を呼び出すと、ほぼ同じ効果が得られます。

38
Pepijn

前面に表示するビューでbringToFront()を呼び出してから、前面に表示するビューを含むすべてのビューでinvalidate()メソッドを呼び出します。すべてのリスナーに対して同じことを繰り返します。

したがって、別のビューのリスナーが呼び出されると、前のビューは無効になり、バックグラウンドになります。

19
noob

以下は、Viewを背面に送信するために使用しているメソッドです(sringToBackの一種であるbringToFrontの反対です)。

    private void moveToBack(View myCurrentView) 
    {
        ViewGroup myViewGroup = ((ViewGroup) myCurrentView.getParent());
        int index = myViewGroup.indexOfChild(myCurrentView);
        for(int i = 0; i<index; i++)
        {
            myViewGroup.bringChildToFront(myViewGroup.getChildAt(i));
        }
    }

お役に立てれば!

9
Al-Noor Ladhani

APIレベル21からview.setZ(float)を使用できることに注意してください。 ここ 詳細情報を見つけることができます。

2
Vadim Kotov

bringToBack()のように動作します

public void moveToBack(ViewGroup viewGroup, View v) {
    int s = 1;
    for (int i = 1; i < viewGroup.getChildCount(); i++) {
        if (viewGroup.getChildAt(1) == v) {
            s = 2;
        } else {
            viewGroup.getChildAt(s).bringToFront();
        }
    }
}
2
Behnam Tajadini

XMLファイルに次の順序で記述する必要があります。

<FrameLayout
Android:id="@+id/frameLayoutXML"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:orientation="vertical"
<ImageView
 Android:id="@+id/imageViewXML"
Android:layout_width="match_parent"
Android:layout_height="match_parent" />
<Android.support.design.widget.FloatingActionButton
Android:id="@+id/floatB_XML"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_gravity="center" />
</FrameLayout>

この場合、imageViewFloatingActionButtonの後ろになります。

何かを変更したい場合は、プログラムで変更します。

public class SomeActivity extends AppCompatActivity {

    //declare variables
    ImageView imageView;
    FrameLayout frameLayout;
    FloatingActionButton floatingActionButtonNew;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        //Here is to call what already exists at XML file
        frameLayout=findViewById(R.id.frameLayoutXML);   
        imageView = findViewById(R.id.imageViewXML);
        //Here is to declare a new Element to add to the view, but is not at XML File
        floatingActionButtonNew=New FloatingActionButton(this);
        frameLayout.removeAllViews();  //here you remove all views.
        frameLayout.addView(imageView);//And you add again the imageView first
        floatingActionButtonNew.setLayoutParams(new 
         RelativeLayout.LayoutParams(
          RelativeLayout.LayoutParams.WRAP_CONTENT,
          RelativeLayout.LayoutParams.WRAP_CONTENT
        )); //Then you can give some format to your floatingButtonNew

        //And finally  add to the frameLayout the new View in this case the floatingButtonNew
        frameLayout.addView(floatingActionButtonNew);
    }
}

ビュー宣言のこの順序で、フローティングボタンから再び画像を取得できます。したがって、最初に宣言されたビューは、2番目に宣言されたビューから戻り、順序を達成するためのキーは、removeAllViewsまたはFrameLayoutLinearLayoutであり、プログラムで追加するときに、このビューを再度追加します。

1
Vero Gorena

インデックスを取得するViewGroup.addViewInLayout()メソッドの機能を使用して、ビューをリストの最後または最初に配置するかどうかを決定することもできます。

1
teoREtik

view.setVisibility(View.INVISIBLE)またはview.setVisibility(View.GONE)を試してみてください。

UPDATE:

This は、やりたいことを達成する方法を示します。

0
A. Abiri

AppCompatライブラリを使用している場合、21 APIレベル未満のデバイスのZ順序を変更する別の方法があります。

ViewCompat.setTranslationZ(view, zValue);
0
Fragment

可視性を0に設定するか、その下のビューを前面に持ってくるだけです。