Справочная информация: Я создаю приложение, которое может создавать оповещения по времени, основанные на местоположении или и то, и другое, а в действии, которое создает будильник, у меня есть флажок для каждого момента времени и карты, и вы снимите флажок если вы не хотите, чтобы одна из этих функций была в вашей тревоге. Вот картина этой деятельности - http://prntscr.com/dr1s74.Некоторые RelativeLayout.LayoutParams не работают
Если вы снимите галочку с карты, она удалит фрагмент и задает параметры макета радиогруппы ниже заголовка (потому что карта ушла сейчас), центрируйте ее и добавьте маржу.
В то время как addRule (RelativeLayout.BELOW, id) работает, как setMargins (левый, верхний, правый, нижний) и addRule (RelativeLayout.CENTER_HORIZONTAL) не работает, и из-за этого радиогруппа находится вне центра и без правильного пробел ниже названия.
XML активность:
Описание возможных проблем: Единственная причина, я могу думать, это происходит в том, что у меня есть CoordinatorLayout в качестве родительского макета (потому что его взаимодействие между FAB и закусочная) и ScrollView внутри него, содержащий RelativeLayout (Открывайте предложения, если у вас есть лучший способ). И это по какой-то причине создает проблемы при попытке добавить правила к параметрам макета. XML код (Убрано Radiobuttons и CheckBox для более удобного просмотра):
<android.support.design.widget.FloatingActionButton
android:id="@+id/saveAlarm"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|right"
android:layout_marginBottom="@dimen/fab_margin"
android:layout_marginRight="@dimen/fab_margin"
android:onClick="fabClicked"
app:srcCompat="@android:drawable/ic_menu_save" />
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/relative_layout_alarm_creator"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:focusable="true"
android:focusableInTouchMode="true"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.rome.locationalarm.AlarmCreator">
<EditText
android:id="@+id/alarmTitle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:fontFamily="sans-serif"
android:hint="Alarm title" />
<fragment xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/map"
android:name="com.google.android.gms.maps.SupportMapFragment"
android:layout_width="match_parent"
android:layout_height="150dp"
android:layout_below="@+id/alarmTitle"
android:layout_marginTop="10dp"
tools:context="com.example.rome.locationalarm.MapsFragment" />
<com.example.rome.locationalarm.CustomTimePicker
android:id="@+id/timePicker"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_below="@+id/days"
android:layout_marginTop="10dp" />
<TextView
android:id="@+id/chooseLocation"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignTop="@+id/map"
android:layout_centerHorizontal="true"
android:text="Choose Location" />
<RadioGroup
android:id="@+id/days"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/map"
android:layout_centerHorizontal="true"
android:layout_marginTop="10dp"
android:orientation="horizontal">
</RadioGroup>
</RelativeLayout>
</ScrollView>
JAVA код (только важная часть):
if(locationCheckBox.isChecked()){
//If user wants location
RelativeLayout.LayoutParams layoutParams= new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
layoutParams.addRule(RelativeLayout.BELOW, mapFragment.getId());
//All of these don't work
layoutParams.setMargins(0, 10, 0, 0); // (left, top, right, bottom)
//All of these are tries to center the radioGroup
layoutParams.addRule(RelativeLayout.CENTER_HORIZONTAL);
layoutParams.addRule(RelativeLayout.ALIGN_PARENT_START);
layoutParams.addRule(RelativeLayout.CENTER_IN_PARENT);
layout.removeView(radioGroup);
layout.addView(radioGroup, layoutParams);
//layout.updateViewLayout(radioGroup, layoutParams); doesn't work as well.
Спасибо за ваше время, пытаясь помочь, хорошо провести год!
попробуйте позвонить 'requestLayout()' после внесения изменений. также вы должны использовать 'getLayoutParams()', как предлагает @Tulsi, и настраивать вместо добавления/удаления. попробуйте просто сделать это представление 'GONE' и изменить видимость. Кроме того, 'CENTER_IN_PARENT' переопределяет любые другие правила компоновки. В любом случае это 'requestLayout()', который запускает представление для настройки своих дочерних элементов (в любом 'View'). –
Спасибо, ребята! Оно работает! и @ escape-llc, что делает requestLayout()? –
, который является «сигналом» к 'View', что его макет недопустим, а на следующем макете, он должен перерасчитать позиции своих детей. поток пользовательского интерфейса контролирует, когда это происходит (например, он имеет насос сообщений); все методы 'requestXXX' работают одинаково, отправив сообщение в поток пользовательского интерфейса для выполнения« позже ». это также почему неразумно манипулировать иерархией «Просмотр» из обратного вызова «Просмотр». –