Поместить вид внутри FrameLayout в Android - PullRequest
8 голосов
/ 03 октября 2010

Я хочу добавить представление внутри FrameLayout программно и поместить его в определенную точку в макете с определенной шириной и высотой.FrameLayout поддерживает это?Если нет, должен ли я использовать промежуточную ViewGroup для достижения этой цели?

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

Моя первоначальная идея состояла в том, чтобы добавить AbsoluteLayout к FrameLayout и поместить представление внутри AbsoluteLayout.К сожалению, я только что узнал, что AbsoluteLayout устарел.

Любые указатели будут высоко оценены.Спасибо.

Ответы [ 5 ]

12 голосов
/ 19 января 2012

В следующем примере (рабочий код) показано, как разместить представление (EditText) внутри FrameLayout.Также показано, как установить позицию EditText с помощью установщика setPadding FrameLayout (каждый раз, когда пользователь нажимает на FrameLayout, позиция EditText устанавливается на позицию щелчка):

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>
2 голосов
/ 25 марта 2014

Вы также можете добавить поле вокруг вновь добавленного вида, чтобы расположить его внутри 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);

Это позволит расположить FrameLayout в 20 пикселях от нижней части экрана.

Редактировать: завершил пример, поэтому он стоит сам по себе. И да, это работает.

2 голосов
/ 27 февраля 2011

Это правда, что с FrameLayout все дочерние элементы привязаны к левому верхнему углу экрана, но у вас все еще есть некоторый контроль с настройкой их заполнения. Если вы установите разные значения заполнения для разных дочерних элементов, они будут отображаться в разных местах в FrameLayout.

1 голос
/ 03 октября 2010

Из ссылки Quinn1000 при условии:

Вы можете добавить несколько дочерних элементов в FrameLayout, но все дочерние элементы привязаны к левому верхнему углу экрана.

Это означает, что вы не можете поместить свой View в определенную точку внутри FrameLayout (за исключением того, что вы хотите, чтобы он был в верхнем левом углу: -)).

Если вам нужно абсолютное позиционирование вида, попробуйте AbsoluteLayout :

Макет, позволяющий указать точное местоположение (координаты х / у) его дочерних элементов. Абсолютные макеты менее гибки и сложнее в обслуживании, чем другие типы макетов без абсолютного позиционирования.

Что касается установки ширины и высоты представления, также как и в Quinn1000, вы предоставляете метод v.setLayoutParams() для LayoutParams объекта в зависимости от выбранного контейнера (AbsoluteLayout, LinearLayout и т. Д.)

0 голосов
/ 03 октября 2010

Поток здесь на stackOverflow в

Как установить SetLayoutParams () для ImageView?

несколько покрывает это.

Например: LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams (30, 30); yourImageView.setLayoutParams (layoutParams);

подразумевает, что вам нужно определить объект LinearLayout.LayoutParams (или, в вашем случае, объект FrameLayout.layoutParams) для передачи в метод setLayoutParams вашего объекта v.

В

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

это почти создает впечатление, что вы можете попросить своего v:

generateDefaultLayoutParams () с помощью этого метода, если вы не определили параметры конкретно.

Но уже поздно, и эти звенья заставляют мои глаза немного кровоточить. Дайте мне знать, если они помогают: -)

...