Разместить вид внутри Framelayout в Android
-
27-09-2019 - |
Вопрос
Я хочу добавить вид внутри программно и размещать его в определенную точку в пределах макета с определенной шириной и высотой. 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 () через этот метод, если вы не определены параметры конкретно.
Но поздно, и эти ссылки заставляют мои глаза немного кровоточить. Дайте мне знать, если они нерпа нибудь :-)