2016-06-29 3 views
1

У меня есть фрагмент внутри ViewPager и я пытаюсь динамически изменять высоту ListView в зависимости от размера экрана.Изменение высоты выравнивания списка ListView

Вот XML-код для моего фрагмента:

Fragment.xml

<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin"> 

    <RelativeLayout 
     android:id="@+id/rlDiscoveredDevice" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_above="@+id/tvSuggestBTOn"> 

     <TextView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:id="@+id/tvDiscoveredDevices" 
      android:layout_alignParentTop="true" 
      android:layout_alignParentStart="true" 
      android:text="@string/text_list_discovered_devices" 
      /> 

     <ProgressBar 
      android:id="@+id/pbDiscoveredDevices" 
      style="?android:attr/progressBarStyleSmall" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_toEndOf="@+id/tvDiscoveredDevices" 
      android:layout_marginStart="16dp" 
      /> 

     <ListView 
      android:id="@+id/lstDiscoveredBTDevices" 
      android:layout_height="250dp" 
      android:layout_width="wrap_content" 
      android:divider="@android:color/transparent" 
      android:dividerHeight="@dimen/list_view_divider_height" 
      android:choiceMode="singleChoice" 
      android:listSelector="@color/list_item_selected" 
      android:layout_below="@+id/tvDiscoveredDevices" 
      android:layout_marginTop="@dimen/list_view_margin_top" 
      /> 

    </RelativeLayout> 

    <ImageButton 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/pairBT" 
     android:background="@drawable/ic_action_down" 
     android:layout_marginStart="134dp" 
     android:layout_below="@+id/rlDiscoveredDevice" 
     android:layout_alignParentStart="true" 
     /> 

    <ImageButton 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/unpairBT" 
     android:background="@drawable/ic_action_up" 
     android:layout_below="@+id/rlDiscoveredDevice" 
     android:layout_toEndOf="@+id/pairBT" 
     android:layout_marginStart="73dp" 
     /> 

    <RelativeLayout 
     android:id="@+id/rlPairedDevice" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_below="@+id/pairBT"> 

     <TextView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:id="@+id/tvPairedDevices" 
      android:text="@string/text_list_paired_devices" 
      android:layout_alignParentStart="true" 
      /> 

     <ListView 
      android:id="@+id/lstPairedBTDevices" 
      android:layout_height="wrap_content" 
      android:layout_width="fill_parent" 
      android:divider="@android:color/transparent" 
      android:dividerHeight="@dimen/list_view_divider_height" 
      android:choiceMode="singleChoice" 
      android:listSelector="@color/list_item_selected" 
      android:layout_below="@+id/tvPairedDevices" 
      android:layout_alignParentStart="true" 
      android:layout_marginTop="@dimen/list_view_margin_top" 
      /> 

    </RelativeLayout> 

</RelativeLayout> 

Вот мой Java-код, который я использую, чтобы динамически изменять высоту:

DiscoveredDevice.java

public class DiscoveredDevice extends Fragment{ 
    final String TAG = "DiscoverDevice Fragment"; 
    private SharedPreferences appPrefs; 
    private BTActions btActions; 
    private ArrayList<BluetoothDevice> arrDiscoveredDevicesList; 
    private Set<BluetoothDevice> arrPairedDevicesList; 
    private ArrayAdapter<String> btDiscListArrayAdapter; 
    private ArrayAdapter<String> btPairedListArrayAdapter; 
    private String strDiscoveredListItemSelected = ""; 
    private String strPairedListItemSelected = ""; 
    private CommonFunctions cf; 
    private boolean blnIsFragmentLoaded = false; 

    // UI Objects 
    private TextView tvDiscoveredDevices; 
    private TextView tvPairedDevices; 
    private ListView lvDiscoveredList; 
    private ListView lvPairedDevicesList; 
    private ImageButton ibtnPair; 
    private ImageButton ibtnUnPair; 
    private ProgressBar pbDiscDevicesSpinner; 
    private TextView tvSuggestBTOn; 
    private ProgressBar pbLoading; 

    public DiscoveredDevice() { 
     btActions = new BTActions(); 
     cf = new CommonFunctions(); 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     Log.i(TAG, "Begin render of Discovered Device fragment..."); 
     super.onCreate(savedInstanceState); 

     // Define variables 
     appPrefs = this.getActivity().getPreferences(Context.MODE_PRIVATE); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     // Inflate the layout for this fragment 
     return inflater.inflate(R.layout.fragment_discovered_device, container, false); 
    } 

    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 

     // Define the lists on DiscoveredDevice fragment 
     btDiscListArrayAdapter = new ArrayAdapter<>(getContext(), R.layout.simple_row, R.id.simple_row_Txt); 
     btPairedListArrayAdapter = new ArrayAdapter<>(getContext(), R.layout.simple_row, R.id.simple_row_Txt); 

     // Define UI Objects 
     defineUIObjects(); 

     // Position UI objects 
     positionUIObjects(); 
    } 

    @Override 
    public void setUserVisibleHint(boolean isVisibleToUser) { 
     super.setUserVisibleHint(isVisibleToUser); 
    } 

    private void defineUIObjects() { 
     tvDiscoveredDevices = (TextView) getView().findViewById(R.id.tvDiscoveredDevices); 
     tvPairedDevices = (TextView) getView().findViewById(R.id.tvPairedDevices); 
     lvDiscoveredList = (ListView) getView().findViewById(R.id.lstDiscoveredBTDevices); 
     lvPairedDevicesList = (ListView) getView().findViewById(R.id.lstPairedBTDevices); 
     ibtnPair = (ImageButton) getView().findViewById(R.id.pairBT); 
     ibtnUnPair = (ImageButton) getView().findViewById(R.id.unpairBT); 
     tvSuggestBTOn = (TextView) getView().findViewById(R.id.tvSuggestBTOn); 
     pbDiscDevicesSpinner = (ProgressBar) getView().findViewById(R.id.pbDiscoveredDevices); 

     pbLoading = (ProgressBar) getView().findViewById(R.id.spin_kit_progress); 
     pbLoading.setIndeterminateDrawable(new DoubleBounce()); 
    } 

    private void positionUIObjects() { 
     final ViewGroup vgDiscDevice = (ViewGroup) getView().findViewById(R.id.rlDiscoveredDevice); 
     final AtomicInteger aiLayoutHeight = new AtomicInteger(); 

     Rect rect = new Rect(); 

     // Get the window 
     Window win = getActivity().getWindow(); 
     win.getDecorView().getWindowVisibleDisplayFrame(rect); 

     // Find height of AppBarLayout 
     AppBarLayout ablTabs = (AppBarLayout) getActivity().findViewById(R.id.ablTabs); 

     // Obtain the screen height & width 
     DisplayMetrics metrics = new DisplayMetrics(); 
     getActivity().getWindowManager().getDefaultDisplay().getMetrics(metrics); 
     int intScreenHeight = metrics.heightPixels; 
     int intScreenWidth = metrics.widthPixels; 
     Log.i(TAG, "Actual Screen Height = " + intScreenHeight + " Width = " + intScreenWidth); 

     // Set the height for Discovered Devices list 
     RelativeLayout.LayoutParams rlParams = (RelativeLayout.LayoutParams) getView().findViewById(R.id.rlDiscoveredDevice).getLayoutParams(); 

     // Get height of Discovered Devices relative layout 
     int intDiscoveredDevicesRLHeight = (int)(Math.round((intScreenHeight - rect.top - ablTabs.getMeasuredHeight()) * 0.45)); 
     Log.i(TAG, "Setting the height of Discovered Devices Relative layout as '" + intDiscoveredDevicesRLHeight + "'"); 
     rlParams.topMargin = ablTabs.getMeasuredHeight(); 
     rlParams.leftMargin = 50; // I DID THIS JUST TO CHECK IF THE LEFT MARGIN GETS MOVED TO THE RIGHT. THIS IS WHERE I NEED A BETTER WAY TO PROPERLY ALIGN THE LIST 
     rlParams.height = intDiscoveredDevicesRLHeight; 

     lvDiscoveredList.setLayoutParams(rlParams); 

    } 

Я хочу, чтобы каждый список занимал 45% экрана (исключая AppBarLa Вы т). Если вы видите снимок экрана ниже, когда я устанавливаю новую высоту, ListView выходит из строя, а часть его получает разрезы слева от экрана. Я установил левое поле на 50, чтобы отобразить его.

[Скриншот]

enter image description here

Я поместил 2 ListViews внутри RelativeLayouts, так что они могут быть индивидуально контролируемые в целом. Я здесь что-то не так?

+0

решение, которое я разместил для вас? –

ответ

0

Я думаю, вы можете достичь этого только с помощью xml, без динамического изменения размера!

В своем сообщении вы упомянули, что хотите, чтобы каждый из списков отображал 45% доступной высоты. Таким образом, я предполагаю, что содержание центра с изображениями будет занимать 10% высоты (хотя этот подход также будет работать, если бы они имели фиксированную высоту, я включу этот ответ тоже внизу.

Все вам нужно изменить макет верхнего уровня на LinearLayout (с вертикальной ориентацией), поместить ваши изображения в LinearLayout (с горизонтальной ориентацией), изменить некоторые высоты ваших представлений и добавить атрибуты layout_weight к двум RelativeLayouts ., а внутренний LinearLayout будет создан Вот пример того, что ваш XML будет выглядеть следующим образом:

<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin"> 

    <RelativeLayout 
     android:id="@+id/rlDiscoveredDevice" 
     android:layout_width="match_parent" 
     android:layout_height="0dp" 
     android:layout_above="@+id/tvSuggestBTOn" 
     android:layout_weight="9"> 

     <TextView 
      android:id="@+id/tvDiscoveredDevices" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_alignParentStart="true" 
      android:layout_alignParentTop="true" 
      android:text="@string/text_list_discovered_devices" 
      /> 

     <ProgressBar 
      android:id="@+id/pbDiscoveredDevices" 
      style="?android:attr/progressBarStyleSmall" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_marginStart="16dp" 
      android:layout_toEndOf="@+id/tvDiscoveredDevices" 
      /> 

     <ListView 
      android:id="@+id/lstDiscoveredBTDevices" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:layout_below="@+id/tvDiscoveredDevices" 
      android:divider="@android:color/transparent" 
      android:dividerHeight="@dimen/list_view_divider_height" 
      android:choiceMode="singleChoice" 
      android:listSelector="@color/list_item_selected" 
      android:background="@drawable/abc_list_selector_disabled_holo_dark" 
      /> 

    </RelativeLayout> 

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="0dp" 
     android:gravity="center" 
     android:layout_weight="2"> 

     <ImageButton 
      android:id="@+id/pairBT" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:background="@drawable/ic_action_down" 
      /> 

     <ImageButton 
      android:id="@+id/unpairBT" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:background="@drawable/ic_action_up"/> 
    </LinearLayout> 

    <RelativeLayout 
     android:id="@+id/rlPairedDevice" 
     android:layout_width="match_parent" 
     android:layout_height="0dp" 
     android:layout_weight="9"> 

     <TextView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:id="@+id/tvPairedDevices" 
      android:text="@string/text_list_paired_devices" 
      android:layout_alignParentStart="true" 
      /> 

     <ListView 
      android:id="@+id/lstPairedBTDevices" 
      android:layout_height="match_parent" 
      android:layout_width="match_parent" 
      android:divider="@android:color/transparent" 
      android:dividerHeight="@dimen/list_view_divider_height" 
      android:choiceMode="singleChoice" 
      android:listSelector="@color/list_item_selected" 
      android:layout_below="@+id/tvPairedDevices" 
      android:layout_alignParentStart="true" 
      android:background="@drawable/abc_list_selector_disabled_holo_dark" 
      /> 

    </RelativeLayout> 

</LinearLayout> 

важно отметить здесь, что RelativeLayouts теперь есть вес каждого из 9, а средняя линейная компоновка имеет вес 2. Таким образом, пространство в линейном макете верхнего уровня будет разделено на это соотношение, RelativeLayouts получит 45% каждый, а LinearLayout получит 10%.

Если вы хотите, чтобы линейная компоновка в центре была обертыванием контента вместо того, чтобы принимать 10% экрана (я бы рекомендовал это), тогда вы можете пойти и назначить ему высоту wrap_content и удалить из него атрибут layout_weight , Верхний уровень LinearLayout затем примет оставшуюся высоту после выделения пространства для центра LinearLayout и разделит его равномерно между двумя относительными макетами.

PS: (Возможно, вы можете использовать xml, который я разместил здесь. Я устанавливаю фоны в представлениях списка, чтобы облегчить мне просмотр их размеров без данных, не забудьте удалить их).

PPS: Обратите внимание, что этот подход позволяет удалить множество атрибутов позиционирования макета, которые были у вас с относительным расположением верхнего уровня! Это не только улучшает чистоту вашего кода, но и делает ваш интерфейс более совершенным (Relative Layouts are less performant than other view groups, especially when nested).

+0

Привет, доктор Нитпик ... Спасибо за ответ ур. Я из страны в настоящее время. Вернусь в пару часов и дам вам знать. – AyeVeeKay

+0

Звучит как план, безопасные путешествия! –

+0

Спасибо за аккуратное и понятное объяснение. Работает как шарм. – AyeVeeKay

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