2012-08-27 10 views
7

Tôi có một hoạt động với cách bố trí như sau:RelativeLayout Gravity không được áp dụng?

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:id="@+id/testlayoutOverlays" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" > 

<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/testlayoutMain" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" > 

    <RelativeLayout 
     android:id="@+id/testlayout_bottom" 
     android:layout_width="fill_parent" 
     android:layout_height="62dp" 
     android:background="#122334" > 

     <ImageView 
      android:id="@+id/testbtnBlock" 
      android:layout_width="60dp" 
      android:layout_height="60dp" 
      android:layout_alignParentLeft="true" 
      android:layout_gravity="left|center_vertical" 
      android:contentDescription="Test1" 
      android:padding="@dimen/padding_medium" 
      android:src="@drawable/btnblock" /> 

     <TextView 
      android:id="@+id/testtxtZoomPan" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:layout_centerVertical="true" 
      android:layout_toLeftOf="@+id/testbtnX" 
      android:layout_toRightOf="@+id/testbtnBlock" 
      android:gravity="center_horizontal" 
      android:text="@string/txtZoomPan" 
      android:textColor="#FFFFFF" /> 

     <ImageView 
      android:id="@+id/testbtnX" 
      android:layout_width="60dp" 
      android:layout_height="60dp" 
      android:layout_alignParentRight="true" 
      android:layout_gravity="right|center_vertical" 
      android:contentDescription="Test2" 
      android:padding="@dimen/padding_medium" 
      android:src="@drawable/btnx" /> 
    </RelativeLayout> 

    <LinearLayout 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     xmlns:tools="http://schemas.android.com/tools" 
     android:id="@+id/testlayoutPuzzleInfo" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_marginBottom="10dp" 
     android:orientation="horizontal" > 

     <LinearLayout 
      xmlns:android="http://schemas.android.com/apk/res/android" 
      xmlns:tools="http://schemas.android.com/tools" 
      android:id="@+id/testlayoutChronoErrors" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:orientation="vertical" > 

      <Chronometer 
       android:id="@+id/testchronometer" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:layout_weight="0" 
       android:format="@string/chronometer_initial_format" 
       android:gravity="center" /> 

      <LinearLayout 
       xmlns:android="http://schemas.android.com/apk/res/android" 
       xmlns:tools="http://schemas.android.com/tools" 
       android:id="@+id/testlayoutErrors" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:orientation="horizontal" > 

       <ImageView 
        android:layout_width="1px" 
        android:layout_height="20dp" /> 
      </LinearLayout> 
     </LinearLayout> 
    </LinearLayout> 
</LinearLayout> 

</RelativeLayout> 

và đoạn mã sau:

package minmaxdev.android.picrossanywhere; 

import android.os.Bundle; 
import android.app.Activity; 
import android.content.Intent; 
import android.view.Gravity; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.ImageView; 
import android.widget.RelativeLayout; 
import android.support.v4.app.NavUtils; 

public class TestActivity extends Activity { 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_test); 

    // Capture our button from layout 
    ImageView button = (ImageView) findViewById(R.id.testbtnBlock); 
    // Register the onClick listener with the implementation above 
    button.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View arg0) { 
      RelativeLayout rv = (RelativeLayout) findViewById(R.id.testlayoutOverlays); 
      rv.setGravity(Gravity.CENTER); 

      Button btnRetry = new Button(TestActivity.this); 
      btnRetry.setId(R.id.btnRetry); 
      btnRetry.setBackgroundResource(R.drawable.btnselector); 
      RelativeLayout.LayoutParams prmBtn = new RelativeLayout.LayoutParams(Util.DPsToPixels(200, getResources()), Util.DPsToPixels(40, getResources())); 
      prmBtn.setMargins(0, 120, 0, 0); 
      btnRetry.setLayoutParams(prmBtn); 
      // btnRetry.setGravity(Gravity.CENTER_HORIZONTAL); 
      btnRetry.setText("Retry"); 
      btnRetry.setOnClickListener(new ImageView.OnClickListener() { 
       public void onClick(View v) { 
        Intent intent = getIntent(); 
        finish(); 
        startActivity(intent); 
       } 
      }); 
      rv.addView(btnRetry); 
     } 

    }); 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.activity_test, menu); 
    return true; 
} 
} 

Tôi muốn biết: Tại sao nút tự động tạo ra của tôi (tên btnRetry) không xuất hiện trong trung tâm của màn hình, vì tôi đặt trọng số RelativeLayout mẹ thành trung tâm với rv.setGravity(Gravity.CENTER)?

Cảm ơn bạn rất nhiều vì đã dành thời gian

+0

Có thể trùng lặp [Vấn đề bố cục tương đối Android có trọng lực] (http://stackoverflow.com/questions/2804411/android-relative-layout-problem-with-gravity) –

Trả lời

13

Câu trả lời thật dễ dàng. Trọng lực hoạt động cho nội dung, layout_gravity cho chế độ xem sử dụng điều đó. Nguồn cơ bản: https://stackoverflow.com/a/3482757/180538

Cố gắng sử dụng LayoutParams với addRule(RelativeLayout.CENTER_IN_PARENT, RelativeLayout.TRUE);

Để trả lời sự hiểu biết lực hấp dẫn của bạn: Bạn nói đúng nhưng tôi đoán rằng thông tin này trong documentation là quan trọng:

Lưu ý rằng kể từ khi RelativeLayout xem xét vị trí của từng đứa trẻ có liên quan với nhau để có ý nghĩa, việc đặt trọng lực sẽ ảnh hưởng đến vị trí của tất cả trẻ em như một đơn vị duy nhất trong cha mẹ. Điều này xảy ra sau khi trẻ em đã được tương đối vị trí.

Tôi không thể kiểm tra bố cục của bạn tại thời điểm này nhưng dự đoán của tôi là thời gian áp dụng trọng lực không tạo ra kết quả mong đợi.

Cá nhân tôi chỉ sử dụng trọng lực trong LinearLayouts và centerInParent cho RelativeLayouts.

+0

Xin chào và cảm ơn! Có vẻ như nó hoạt động ... một vài câu hỏi để giúp tôi hiểu rõ hơn: Bạn nói Gravity làm việc cho nội dung ... trong ví dụ của tôi, không phải là nút 'nội dung' của RelativeView? – ibiza

+0

Ngoài ra tôi đã phải sử dụng addRule thay vào đó, chỉ có 1 tham số. Hàm setRule có tồn tại không? Điều gì sẽ là ý nghĩa của tham số thứ hai? – ibiza

+0

Tôi đã sửa đổi có thể trả lời. Bạn đúng, nó phải là 'addRule()'. Cả hai phương thức đều có sẵn, một với một tham số và một với hai tham số. Tôi muốn sử dụng cái thứ hai (xem câu trả lời của tôi). – WarrenFaith