2010-10-03 40 views
8

Tôi muốn thêm chế độ xem bên trong FrameLayout theo chương trình và đặt nó vào một điểm cụ thể trong bố cục với chiều rộng và chiều cao cụ thể. FrameLayout có hỗ trợ điều này không? Nếu không, tôi có nên sử dụng một ViewGroup trung gian để đạt được điều này không?Chế độ xem địa điểm bên trong FrameLayout trong Android

int x; // Can be negative? 
int y; // Can be negative? 
int width; 
int height; 
View v = new View(context); 
// v.setLayoutParams(?); // What do I put here? 
frameLayout.addView(v); 

Ý tưởng ban đầu của tôi là thêm AbsoluteLayout vào FrameLayout và đặt chế độ xem trong AbsoluteLayout. Thật không may tôi chỉ phát hiện ra rằng AbsoluteLayout không được chấp nhận.

Mọi con trỏ sẽ được đánh giá cao. Cảm ơn.

+0

bạn đã giải quyết vấn đề đó bằng cách nào đó chưa? Tôi quan tâm đến giải pháp không phải là AbsoluteLayout :) – WarrenFaith

Trả lời

2

Đó là đúng với FrameLayout tất cả trẻ em được gắn vào phía trên bên trái của màn hình, nhưng bạn vẫn có một số kiểm soát với thiết lập padding của họ.Nếu bạn đặt các giá trị đệm khác nhau cho các trẻ khác nhau, chúng sẽ hiển thị ở các vị trí khác nhau trong FrameLayout.

+8

Nhưng vấn đề với điều này là các danh sách nhấp chuột sẽ mở rộng toàn bộ khu vực bắt đầu từ góc trên bên trái ... – Pepster

0

Các chủ đề ở đây trên Stackoverflow tại

How do you setLayoutParams() for an ImageView?

bao gồm nó một chút.

Ví dụ: LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams (30, 30); yourImageView.setLayoutParams (layoutParams);

ngụ ý rằng bạn cần phải xác định một đối tượng LinearLayout.LayoutParams (hoặc trong trường hợp của bạn là một đối tượng FrameLayout.layoutParams) để chuyển sang phương thức setLayoutParams của đối tượng v của bạn.

Tại

http://developer.android.com/reference/android/widget/FrameLayout.html

nó gần như làm cho nó trông giống như bạn có thể hỏi câu của bạn để:

generateDefaultLayoutParams() thông qua phương pháp này nếu bạn chưa xác định các thông số cụ thể.

Nhưng đã muộn rồi, và những liên kết đó khiến đôi mắt tôi chảy máu một chút. Hãy cho tôi biết nếu họ nGiúp bất kỳ :-)

1

Từ link Quinn1000 cung cấp:

Bạn có thể thêm nhiều trẻ em đến một FrameLayout, nhưng tất cả trẻ em được neo vào phía trên bên trái của màn hình.

Điều này có nghĩa là bạn không thể đặt Chế độ xem của mình tại một điểm cụ thể bên trong FrameLayout (ngoại trừ bạn muốn nó ở góc trên cùng bên trái :-)).

Nếu bạn cần định vị tuyệt đối của View, thử AbsoluteLayout:

Một bố trí cho phép bạn chỉ định vị trí chính xác (x/y tọa độ) của con của nó. Bố cục tuyệt đối ít linh hoạt và khó bảo trì hơn các loại bố cục khác mà không có vị trí tuyệt đối.

Đối với thiết lập chiều rộng và chiều cao của View, cũng như Quinn1000 nói, bạn cung cấp phương pháp v.setLayoutParams() một đối tượng LayoutParams, tùy thuộc vào container mà bạn đã chọn (AbsoluteLayout, LinearLayout, vv)

+2

Thật không may AbsoluteLayout không còn được dùng nữa. – hpique

+0

Bạn nói đúng. Tôi đã bỏ lỡ điều đó khi tôi xem xét API trước đó. Tôi đoán bạn có thể chơi với margin-left/top cho View của bạn bên trong FrameLayout để có được trải nghiệm tương tự với AbsoluteLayout. –

+0

Tôi làm cách nào để lập trình? – hpique

10

Ví dụ sau (mã hoạt động) cho biết cách đặt chế độ xem (EditText) bên trong FrameLayout. Ngoài ra nó cho thấy làm thế nào để thiết lập vị trí của EditText sử dụng setter setPadding của FrameLayout (mọi người dùng nhấp vào FrameLayout, vị trí của EditText được thiết lập để vị trí của các nhấp chuột):

public class TextToolTestActivity extends Activity{ 
    FrameLayout frmLayout; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     frmLayout = (FrameLayout)findViewById(R.id.frameLayout1); 
     frmLayout.setFocusable(true); 
     EditText et = new EditText(this); 

     frmLayout.addView(et,100,100); 
     frmLayout.setOnTouchListener(new OnTouchListener() { 

      @Override 
      public boolean onTouch(View v, MotionEvent event) { 
       Log.i("TESTING","touch x,y == " + event.getX() + "," +  event.getY()); 
       frmLayout.setPadding(Math.round(event.getX()),Math.round(event.getY()) , 0, 0); 
      return true; 
     } 
    }); 

} 

}

main.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 
    <FrameLayout 
     android:id="@+id/frameLayout1" 
     android:layout_height="fill_parent" android:layout_width="fill_parent"> 
    </FrameLayout> 

</LinearLayout> 
+0

Điều này liên quan đến câu hỏi như thế nào? – zeh

+2

Vâng .. đó là một cái nhìn bên trong của một Framelayout phải không? Ngoài ra, tôi đang hiển thị cách định vị chế độ xem được nhúng ở một nơi cụ thể bằng cách sử dụng setterding setterding. – tulio84z

+0

Bạn chính xác. Tôi đã bỏ lỡ một phần phản hồi của bạn. – zeh

1

Bạn cũng có thể thêm một biên độ xung quanh quan điểm mới được bổ sung vào vị trí của nó bên trong FrameLayout.

FrameLayout frameLayout = (FrameLayout) findViewById(R.id.main); // or some other R.id.xxx 
DisplayMetrics metrics = context.getResources().getDisplayMetrics(); 
LayoutParams params = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); 
params.setMargins(0, metrics.heightPixels - 20, 0, 0); 
View v = new View(context); 
v.setLayoutParams(params); 
frameLayout.addView(v); 

Điều này sẽ định vị FrameLayout 20 pixel từ dưới cùng của màn hình.

Chỉnh sửa: hoàn thành ví dụ để nó tự viết tắt. Và oh, vâng, nó hoạt động.

+0

1) chiều rộng là gì? nó đến từ đâu? 2) metric.width không tồn tại, metric.widthPixels của nó. 3) Điều này không làm việc, và nếu nó sẽ, nó vẫn sẽ không vì bạn không thêm v bất cứ nơi nào ... – glace

Các vấn đề liên quan