How to send view to back ? How to control the z-order programmatically?

后端 未结 12 959
隐瞒了意图╮
隐瞒了意图╮ 2020-12-05 04:12

I have a problem to send the view to back. In Android we have a method like bringToFront(), to place the view on top of the another view. Like that, I want to p

相关标签:
12条回答
  • 2020-12-05 04:15

    If you're using appCompat library, there's another way to change Z order for devices lower than 21 API level:

    ViewCompat.setTranslationZ(view, zValue);
    
    0 讨论(0)
  • 2020-12-05 04:16

    In your XML File you must to write in order:

    <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>
    

    In this case, the imageView will be back of the FloatingActionButton.

    If you want change something, and you will do it programmatically then:

    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);
        }
    }
    

    In this order of view declarations, you will have again the image back from the floating button. So the view that is declared first will be back from the view that is declared secondly, and the key to achieve the order, is to removeAllViews of a FrameLayout or LinearLayout and add again this views when you are adding programmatically.

    0 讨论(0)
  • 2020-12-05 04:28

    I would either set it's visibility to 0 or just bring the view under it in front of it.

    0 讨论(0)
  • 2020-12-05 04:30

    Call bringToFront() on the view you want to get in the front, and then call the invalidate() method on all the view including the view which you want in the front. Repeat same for all the listeners.

    So when another view's listener will get called, the previous view will get invalidated and will be in background.

    0 讨论(0)
  • 2020-12-05 04:31

    Here is the method I am using to send a View to the back (so opposite of bringToFront, kind of sendToBack):

        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));
            }
        }
    

    Hope this helps!

    0 讨论(0)
  • 2020-12-05 04:31

    it work's fine like 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();
            }
        }
    }
    
    0 讨论(0)
提交回复
热议问题