2017-01-03 4 views
0

Справочная информация: Я создаю приложение, которое может создавать оповещения по времени, основанные на местоположении или и то, и другое, а в действии, которое создает будильник, у меня есть флажок для каждого момента времени и карты, и вы снимите флажок если вы не хотите, чтобы одна из этих функций была в вашей тревоге. Вот картина этой деятельности - 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. 

Спасибо за ваше время, пытаясь помочь, хорошо провести год!

ответ

0

вам нужно сделать это, чтобы получить LayoutParams

RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) getLayoutParams(); 
+0

попробуйте позвонить 'requestLayout()' после внесения изменений. также вы должны использовать 'getLayoutParams()', как предлагает @Tulsi, и настраивать вместо добавления/удаления. попробуйте просто сделать это представление 'GONE' и изменить видимость. Кроме того, 'CENTER_IN_PARENT' переопределяет любые другие правила компоновки. В любом случае это 'requestLayout()', который запускает представление для настройки своих дочерних элементов (в любом 'View'). –

+0

Спасибо, ребята! Оно работает! и @ escape-llc, что делает requestLayout()? –

+0

, который является «сигналом» к 'View', что его макет недопустим, а на следующем макете, он должен перерасчитать позиции своих детей. поток пользовательского интерфейса контролирует, когда это происходит (например, он имеет насос сообщений); все методы 'requestXXX' работают одинаково, отправив сообщение в поток пользовательского интерфейса для выполнения« позже ». это также почему неразумно манипулировать иерархией «Просмотр» из обратного вызова «Просмотр». –

Смежные вопросы