ビューを戻すのに問題があります。 Android=には、ビューを別のビューの上に配置するbringToFront()
などのメソッドがあります。そのように、前の画像の下にビューを配置します。
AndroidにはsendToBack()
やbringToBack()
などのメソッドがありますか?もしそうなら、誰でもこれで私を助けることができます。
注:レイアウトにアイテムを配置する順序によってzオーダーを制御したくないので、zオーダーをプログラムで制御したいです。
前面のビューを非表示にするのではなく、移動するビューの背後に表示するだけです。
Afaikには、このための組み込みソリューションはありません。 FrameLayoutのzオーダーなどを変更しようとしていると思います。
ただし、レイアウトに含まれる子要素の順序を変更できると思います。 RemoveChild ...()およびaddView()メソッドは位置の値を取ることができるため、子要素を交換する可能性が高く、それによってzオーダーが変更されます。しかし、それは少しハッキーな解決策のようです。
または、子ビューの可視性プロパティを変更することを検討してください。同様の動作が得られる場合がありますが、それは私が考えるよりずっときれいになるでしょう。
編集:
新しいバージョンAndroid=、L Developer Previewでは、ようやくビューのZ順序を簡単に変更できるようになりました。 https://developer.Android.com/preview/material/views-shadows.html
私はこれが他の回答で暗示されていることを理解していますが、誰もコードを投稿していません。ビューを処理するための「ヘルパー」関数があるユーティリティクラスに以下を保持します。
public static void sendViewToBack(final View child) {
final ViewGroup parent = (ViewGroup)child.getParent();
if (null != parent) {
parent.removeView(child);
parent.addView(child, 0);
}
}
sendToBack()
メソッドはありません。しかし、下のビューでbringToFront()
を呼び出すと、ほぼ同じ効果が得られます。
前面に表示するビューでbringToFront()
を呼び出してから、前面に表示するビューを含むすべてのビューでinvalidate()
メソッドを呼び出します。すべてのリスナーに対して同じことを繰り返します。
したがって、別のビューのリスナーが呼び出されると、前のビューは無効になり、バックグラウンドになります。
以下は、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));
}
}
お役に立てれば!
APIレベル21からview.setZ(float)
を使用できることに注意してください。 ここ 詳細情報を見つけることができます。
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();
}
}
}
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>
この場合、imageView
はFloatingActionButton
の後ろになります。
何かを変更したい場合は、プログラムで変更します。
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
またはFrameLayout
のLinearLayout
であり、プログラムで追加するときに、このビューを再度追加します。
インデックスを取得するViewGroup.addViewInLayout()
メソッドの機能を使用して、ビューをリストの最後または最初に配置するかどうかを決定することもできます。
view.setVisibility(View.INVISIBLE)
またはview.setVisibility(View.GONE)
を試してみてください。
UPDATE:
This は、やりたいことを達成する方法を示します。
AppCompatライブラリを使用している場合、21 APIレベル未満のデバイスのZ順序を変更する別の方法があります。
ViewCompat.setTranslationZ(view, zValue);
可視性を0に設定するか、その下のビューを前面に持ってくるだけです。