#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
? В любом случае, я думаю, что проблема может возникнуть из-за включения aListView
, у которого уже есть прокрутка, внутри aScrollView
.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 поля, иначе он продолжается обычным способом.
Надеюсь, мой ответ понятен