Относительный макет в режиме прокрутки не работает

#android #scrollview #android-relativelayout

#Android #scrollview #android-relativelayout

Вопрос:

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

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

Вот мой xml,

  <?xml version="1.0" encoding="utf-8"?>
 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">

<TextView android:id="@ id/textView1" android:layout_below="@ id/logoTop"
    android:layout_height="wrap_content" android:layout_width="wrap_content"
    android:text="TextView" android:layout_alignLeft="@ id/logoTop"></TextView>

<ImageView android:src="@drawable/logotop" android:id="@ id/logoTop"
    android:layout_alignParentTop="true" android:layout_width="match_parent"  
    android:scaleType="fitXY" android:layout_height="wrap_content"></ImageView>

<ImageView android:src="@drawable/bardown" android:id="@ id/barDown"
    android:layout_width="match_parent" android:scaleType="fitXY"
    android:layout_alignParentBottom="true" android:layout_height="40dip">
</ImageView>

<ImageButton 
    android:layout_width="wrap_content" android:layout_height="wrap_content"
    android:id="@ id/btnMap" android:layout_centerInParent="true" android:src="@drawable/map"
    android:background="@drawable/mapselector" android:scaleType="fitXY"
    android:layout_alignParentBottom="true">
</ImageButton>

<ImageButton 
    android:layout_width="wrap_content" android:layout_height="wrap_content"
    android:id="@ id/utBtn" android:background="@drawable/utilitiesicon"
    android:scaleType="fitXY" android:layout_alignTop="@ id/barDown" android:src="@drawable/utilityselector"
    android:layout_alignParentRight="true" android:layout_marginRight="10dip"
    android:layout_marginTop="3dip">
</ImageButton>

 <ScrollView 
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  android:layout_below="@ id/logoTop"
  android:layout_above="@ id/barDown"
  android:scrollbars="none">

    <RelativeLayout  android:id="@ id/tour" 
    android:layout_width="wrap_content" android:layout_height="wrap_content">

<ImageView android:id="@ id/abtHome" android:layout_below="@ id/logoTop"
    android:src="@drawable/abouthome" android:scaleType="fitXY"
    android:layout_width="match_parent" android:maxWidth="230dip"
    android:layout_height="230dip">
</ImageView> 

<ListView android:id="@ id/tourList" android:layout_below="@ id/abtHome"
    android:scrollbars="none" android:visibility="visible"
    android:layout_centerInParent="true" android:layout_above="@ id/barDown"
    android:background="#FFFFFF" android:cacheColorHint="#00000000" android:fadingEdge="horizontal"
    android:fastScrollEnabled="true" android:layout_width="wrap_content" 
    android:layout_height="wrap_content" android:isScrollContainer="false">
</ListView> 

<TextView android:id="@ id/tourcity" android:layout_above="@ id/tourList"
    android:layout_height="wrap_content" android:layout_width="match_parent"
    android:textSize="25dip" android:layout_centerHorizontal="true"
    android:editable="false" android:paddingTop="5dip" android:textColor="@color/white"
    android:paddingBottom="5dip" android:background="#80000000" android:gravity="center"></TextView>

</RelativeLayout>
</ScrollView>

<ImageButton android:src="@drawable/arrowselector"
    android:layout_height="wrap_content" android:layout_width="wrap_content"   android:layout_alignTop="@ id/barDown"
    android:id="@ id/btnBack" android:background="@drawable/arrowleft" android:layout_marginLeft="10dip"
     android:layout_marginTop="6dip"></ImageButton>

   </RelativeLayout>
  

Любой ответ на это?

Комментарии:

1. не могли бы вы использовать LinearLayout и попробовать это вместо RelativeLayout?

2. Сколько элементов у вас в вашем ListView ? В любом случае, я думаю, что проблема может возникнуть из-за включения a ListView , у которого уже есть прокрутка, внутри a ScrollView .

3. @Adinia, да. Даже я чувствую то же самое. Если это так, есть ли у вас какие-либо предложения? В представлении списка есть 3 элемента

4. @Android Killer, нет элементов относительно друг друга, поэтому я не могу использовать линейную компоновку

Ответ №1:

Установка высоты прокрутки в значение wrap_content или fill_parent не будет иметь большого значения. попробуйте

 android:fillViewport="true"
  

Комментарии:

1. Я попытался включить это. Теперь посмотрите, что экран выглядит так, как и должно быть. Но на этом этапе прокрутка списка по умолчанию также удаляется.

2. можете ли вы подробнее рассказать о «прокрутке списка по умолчанию»?

3. кстати, просмотр списка начинает прокручиваться только после того, как элементы внутри больше не будут помещаться в область просмотра списка.

Ответ №2:

Из описания, которое вы дали своей проблеме, кажется, что ваша высота прокрутки должна быть заполняющей

Ответ №3:

Я думаю, что проблема возникает из-за попытки включить ListView ScrollView , так что вот решение без ScrollView:

 <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        android:id="@ id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@ id/logoTop"
        android:layout_below="@ id/logoTop"
        android:text="TextView" >
    </TextView>

    <ImageView
        android:id="@ id/logoTop"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:scaleType="fitXY"
        android:src="@drawable/logotop" >
    </ImageView>

    <ImageView
        android:id="@ id/barDown"
        android:layout_width="match_parent"
        android:layout_height="40dip"
        android:layout_alignParentBottom="true"
        android:scaleType="fitXY"
        android:src="@drawable/bardown" >
    </ImageView>

    <ImageButton
        android:id="@ id/btnMap"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_centerInParent="true"
        android:background="@drawable/mapselector"
        android:scaleType="fitXY"
        android:src="@drawable/map" >
    </ImageButton>

    <ImageView
        android:id="@ id/abtHome"
        android:layout_width="match_parent"
        android:layout_height="230dip"
        android:layout_below="@ id/logoTop"
        android:maxWidth="230dip"
        android:scaleType="fitXY"
        android:src="@drawable/abouthome" >
    </ImageView>

    <ImageButton
        android:id="@ id/utBtn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_alignTop="@ id/barDown"
        android:layout_marginRight="10dip"
        android:layout_marginTop="3dip"
        android:background="@drawable/utilitiesicon"
        android:scaleType="fitXY"
        android:src="@drawable/utilityselector" >
    </ImageButton>

    <TextView
        android:id="@ id/tourcity"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_above="@ id/tourList"
        android:layout_centerHorizontal="true"
        android:background="#80000000"
        android:editable="false"
        android:gravity="center"
        android:paddingBottom="5dip"
        android:paddingTop="5dip"
        android:textColor="@color/white"
        android:textSize="25dip" >
    </TextView>

    <ListView
        android:id="@ id/tourList"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_above="@ id/barDown"
        android:layout_below="@ id/abtHome"
        android:layout_centerInParent="true"
        android:background="#FFFFFF"
        android:cacheColorHint="#00000000"
        android:fadingEdge="horizontal"
        android:fastScrollEnabled="true"
        android:isScrollContainer="false"
        android:scrollbars="none"
        android:visibility="visible" >
    </ListView>

    <ImageButton
        android:id="@ id/btnBack"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignTop="@ id/barDown"
        android:layout_marginLeft="10dip"
        android:layout_marginTop="6dip"
        android:background="@drawable/arrowleft"
        android:src="@drawable/arrowselector" >
    </ImageButton>

</RelativeLayout>
  

Поскольку у меня нет всех ресурсов, я не могу понять, как это выглядит, но я полагаю, вы можете настроить некоторые дополнительные настройки макета представлений по своему усмотрению.

Комментарии:

1. но при этом макет не прокручивается вправо? Я хочу, чтобы все файлы внутри относительного макета прокручивались одновременно

2. Я могу прокручивать только список. Но я хочу, чтобы другие поля также прокручивались вместе со списком

3. Что ж, извините, но это кажется невозможным; но, может быть, если в вашем списке всегда всего 3 строки, вы могли бы использовать TableView с 3 строками вместо этого !? и поместите изображение, картинку и таблицу внутри ScrollView.

4. Эй, я имею в виду 3 поля в виде строк. Строки будут добавляться в список динамически, это не исправлено

5. Вы также можете динамически добавлять строки в TableView, но реализовать все функциональные возможности списка не так просто. Другой идеей было бы установить текст tourcity и изображение abtHome в качестве верхнего / нижнего колонтитула списка.

Ответ №4:

Ваш макет очень запутанный… Как минимум, я могу выделить следующие наблюдения:

  • Используются конфликтующие теги. Например, в элементе «btnMap»:

     android:layout_alignParentBottom="true"
    android:layout_centerInParent="true"
      
  • Элементы внутреннего слоя выровнены по отношению к элементам старшего уровня.
    Например, «abtHome», который расположен внутри ScrollView, выровнен по отношению к «logoTop», который расположен на верхнем уровне (так же, как ScrollView).
  • ListView используется внутри ScrollView. Если вы хотите добавить верхнюю или нижнюю часть представлений ListView, которые отличаются от элементов ListView, но которые должны прокручиваться с элементами ListView, вы должны использовать addHeaderView и addFooterView методы ListView.

Общий совет: лучше структурировать разметку. Определите основные элементы самого высокого уровня абстракции, а затем заполните их.

В вашем случае я бы сделал что-то вроде этого (если я правильно понимаю, чего вы хотели достичь):

Это просто скелет макета и ViewGroup, который вы должны заменить более подходящими контейнерами.

 <LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <ViewGroup
        android:layout_width="match_parent"
        android:layout_height="80dp">

        <!-- logoTop here -->
    </ViewGroup>

    <ViewGroup
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1">

        <!-- ListView and maybe some overlaying views here -->
    </ViewGroup>

    <ViewGroup
        android:layout_width="match_parent"
        android:layout_height="80dp">

        <!-- barDown here -->
    </ViewGroup>
</LinearLayout>
  

Ответ №5:

Я решил проблему. Нехорошо помещать представление списка внутри режима прокрутки. Итак, что я сделал, разместил 1 текстовый вид и вид изображения в одном XML и раздул его в адаптере списка.

Я поместил эти 2 поля в другой XML, скажем listbox2.xml

  <ImageView android:id="@ id/abtHome" android:layout_below="@ id/logoTop"
    android:src="@drawable/abouthome" android:scaleType="fitXY"
    android:layout_width="match_parent" android:maxWidth="230dip"
    android:layout_height="230dip">
</ImageView> 

<TextView android:id="@ id/tourcity" android:layout_below = "@ id/abtHome"
    android:layout_height="wrap_content" android:layout_width="match_parent"
    android:textSize="25dip" android:layout_centerHorizontal="true"
    android:editable="false" android:paddingTop="5dip" android:textColor="@color/white"
    android:paddingBottom="5dip" android:background="#80000000" android:gravity="center"></TextView>
  

Теперь внутри моего адаптера списка я делаю так

    public View getView(int position, View convertView, ViewGroup parent) {

    if(position == 0) {
        convertView = mInflater.inflate(R.layout.listbox2, null);
        TextView cityLabel = (TextView) convertView.findViewById(R.id.tourcity);
        cityLabel.setText("Some Text");
        return convertView;
    }

    else if (convertView == null || convertView.getTag() == null) {
        convertView = mInflater.inflate(R.layout.listbox, null);
        convertView.setOnClickListener(clickListener);
        holder = new ViewHolder();
        holder.view1 = (TextView) convertView.findViewById(R.id.listText);
        holder.desc = (TextView) convertView.findViewById(R.id.editText1);
        holder.index = (TextView) convertView.findViewById(R.id.index);
        holder.desc.setVisibility(View.GONE);
        holder.priceBtn = (Button) convertView.findViewById(R.id.prcBtn);
        holder.icon = (ImageView) convertView.findViewById(R.id.listIcon);
        convertView.setTag(holder);
    } else {
        holder = (ViewHolder) convertView.getTag();
    }

        return convertView;
 }
  

Если позиция равна 0, я раздуваю этот новый xml, в котором я сохранил вышеуказанные 2 поля, иначе он продолжается обычным способом.

Надеюсь, мой ответ понятен