2017-06-06 20 views
0

RelativeLayoutには、buttonbutton2の2つのボタンがあります。これらの3自体はルートビューの内側にあり、RelativeLayoutです。同じ境界で親レイアウトに子ビューを追加

私はここで達成しようとしていますと、buttonbutton2をクリックされたときから除去されなければならないということである内RelativeLayout(そのIDはotherLayoutです)、それはにあったようにrootViewあるルートViewに同じ範囲で追加されます内側のレイアウト

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:id="@+id/rootView" 
    tools:context="com.test.testproject.MainActivity"> 

    <RelativeLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:id="@+id/otherLayout" 
     > 
     <Button 
      android:id="@+id/button" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_alignParentStart="true" 
      android:layout_alignParentTop="true" 
      android:layout_marginStart="53dp" 
      android:layout_marginTop="94dp" 
      android:text="One" /> 

     <Button 
      android:id="@+id/button2" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_alignBottom="@+id/button" 
      android:layout_marginStart="76dp" 
      android:layout_toEndOf="@+id/button" 
      android:text="Two" /> 

    </RelativeLayout> 

</RelativeLayout> 

Javaコード

public class MainActivity extends AppCompatActivity { 

    Button button,button2; 

    int mLeft,mRight,mTop,mBottom; 
    RelativeLayout otherLayout; 
    RelativeLayout rootView; 
    ViewGroup childParent; 
    int[] mBounds = new int[2]; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     button = (Button) findViewById(R.id.button); 
     button2 = (Button) findViewById(R.id.button2); 
//  rootView = (RelativeLayout) findViewById(R.id.rootView); 
     rootView = (RelativeLayout) findViewById(R.id.rootView); 
     otherLayout = (RelativeLayout) findViewById(R.id.otherLayout); 


     button.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

       Rect r = new Rect(); 

       button2.getLocalVisibleRect(r); 
//    button2.getDrawingRect(r); 
//    ((ViewGroup)button2.getParent()).offsetDescendantRectToMyCoords(button2, r); 

       mLeft = r.left; 
       mRight = r.right; 
       mBottom = r.bottom; 
       mTop = r.top; 

       childParent = (ViewGroup) button2.getParent(); 


       ((ViewGroup)button2.getParent()).removeView(button2); 

       Handler mHandler = new Handler(Looper.getMainLooper()); 

       mHandler.postDelayed(new Runnable() { 
        @Override 
        public void run() { 


         button2.setTop(mTop); 
         button2.setLeft(mLeft); 
         button2.setBottom(mBottom); 
         button2.setRight(mRight); 

/* 
         button2.setX(mBounds[1]); 
         button2.setY(mBounds[0]);*/ 


         ((ViewGroup)rootView).addView(button2); 
        } 
       },1000); 

      } 
     }); 

    } 
} 

私はさまざまな方法を試みたが、うまくいく:

は、ここに私のXMLとJavaコードです。私はgetLocalVisibleRect(),getDrawingRect()とすべてを使用しました(コメント付きのコードで見ることができます)。

どのようにこれを達成できますか?内側のレイアウトにあり、ルートに追加した後のViewは同じ境界とパラメータを持つ必要があり、画面上の位置も変更してはならないということです。

+0

は、なぜあなたはUIを変更したくない場合は、あなたのボタンはRelativeLayoutの外に移動したいのですか? – Eselfar

+0

その目的は何ですか?ユースケースを明確にする。 – azizbekian

+0

@Eselfar - レイアウトの上にターゲット 'View'を実際にオーバーレイするだけです.Viewの位置は変更されたように見えません。その後、他のビューの上にこのビューを描画するズームアニメーションを実行します。私は 'clipChildren'を' false'にすることを試みましたが、それはそのトリックをしませんでした。 –

答えて

1

あなたの問題は、レイアウトパラメータbutton2である可能性があります。これにアプローチする最も簡単な方法は、レイアウト内のbutton2の位置を取得し、新しいレイアウトパラメータを設定することです。 mLeftmTopは、左余白と上余白です。

簡略化したonCreateの方法は以下のとおりですが、なぜこれが有用なのか不思議です。

these caveatsもご覧ください。 Viewのドキュメントでは、setTopなどをレイアウトシステム外で呼び出すべきではない理由を示しています。 (hereを参照してください。)

セットトップ

のボイドセットトップ(int型トップ)

は親にこのビューの相対的なトップの位置を設定します。このメソッドは、レイアウトシステムによって呼び出されるためのもので、レイアウトによっていつでもプロパティが変更される可能性があるため、通常は別の方法で呼び出す必要はありません。私はそれを取得していない

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    Button button; 

    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    button = (Button) findViewById(R.id.button); 
    button2 = (Button) findViewById(R.id.button2); 
    rootView = (RelativeLayout) findViewById(R.id.rootView); 
    otherLayout = (RelativeLayout) findViewById(R.id.otherLayout); 

    button.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      RelativeLayout.LayoutParams params; 
      int top = button2.getTop(); 
      int left = button2.getLeft(); 

      ((ViewGroup) button2.getParent()).removeView(button2); 
      params = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, 
        ViewGroup.LayoutParams.WRAP_CONTENT); 
      params.setMargins(left, top, 0, 0); 
      button2.setLayoutParams(params); 
      rootView.addView(button2); 
     } 
    }); 
} 
関連する問題