Вопрос

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

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

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

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

Это было полезно?

Решение

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

Другие советы

В следующем примере (рабочий код) показывает, как разместить вид (EDitText) внутри фримелайона. Кроме того, он показывает, как установить положение Edittext с помощью установки SetPadding The SetPadding The 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>

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

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

От связь Quinn1000 предоставлен:

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

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

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

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

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

Нить здесь на стеках

Как устанавливать парам () для ImageView?

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

Например: linearlayout.layoutparams layoutparams = new linearlayout.layoutparams (30, 30); juyimageview.etlayoutparams (layoutparams);

Подразумевает, что вам нужно определять Linearlayout.layoutparams (или в вашем случае a framelayout.layoutparams), чтобы перейти к методу SetLayoutParams вашего объекта V.

В

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

Это почти заставляет его выглядеть так, будто вы можете задать ваше V, чтобы:

GeneratedEfaultLayoutParams () через этот метод, если вы не определены параметры конкретно.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top