Я знаю, что это похоже на другие проблемы, но, поскольку я нахожу это довольно странным поведением, я надеюсь, что кто-нибудь объяснит ПОЧЕМУ это происходит.
В основном это известная проблема кликабельности, которую нужно дважды щелкнуть, прежде чем вызвать код onClick
.
Загадочный момент заключается в том, что это происходит только внутри ONE многих экземпляров одного и того же вложенного макета.
Посмотрим ...
У меня есть следующий основной макет:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<ImageView
android:id="@+id/imgBanner"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight=".80"
android:src="@drawable/banner" />
<ScrollView
android:id="@+id/scroll"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight=".20" >
<LinearLayout
android:id="@+id/panContent"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/txtMainTitle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="xxx" />
<TextView
android:id="@+id/txtMainSubtitle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="xxx" />
</LinearLayout>
</ScrollView>
</LinearLayout>
Итак, баннер + свиток с заголовком + подзаголовок.
В этот свиток я хочу вставить некоторые записи, отформатированные со следующим макетом:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="match_parent" >
<TextView
android:id="@+id/txtTitle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true" />
<TextView
android:id="@+id/txtSynopsis"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignBottom="@+id/btnAction"
android:layout_below="@+id/txtTitle"
android:layout_toRightOf="@+id/imgCover" />
<ImageView
android:id="@+id/imgCover"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_below="@+id/txtTitle" />
<Button
android:id="@+id/btnAction"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/imgCover"
android:layout_alignRight="@+id/imgCover"
android:layout_below="@+id/imgCover"
android:text="Download" />
<ImageView
android:id="@+id/imgFade"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBottom="@+id/txtSynopsis"
android:layout_alignLeft="@+id/txtSynopsis"
android:layout_alignRight="@+id/txtSynopsis"
android:scaleType="fitXY"
android:src="@drawable/fade_down" />
<ImageView
android:id="@+id/imgMore"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBottom="@+id/imgFade"
android:layout_alignLeft="@+id/imgFade"
android:layout_alignRight="@+id/imgFade"
android:onClick="showMore"
android:src="@drawable/show_more" />
<ImageView
android:id="@+id/imgLess"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/imgFade"
android:layout_alignRight="@+id/imgFade"
android:layout_below="@+id/txtSynopsis"
android:layout_marginTop="-12dip"
android:onClick="showLess"
android:src="@drawable/show_less"
android:visibility="gone" />
</RelativeLayout>
Что будет:
- заголовок сверху
- слева: обложка книги + кнопка загрузки (под ней)
- справа: синопсис, вырезанный в нижней части кнопки загрузки, с изображением, заставляющим его исчезать на заднем плане (imgFade), и кнопкой «показать больше» (плюс кнопка «показать меньше», которая остается скрытым)
В методе onCreate
я добавляю некоторый контент в элемент panContent
следующим образом:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
LinearLayout panContent = (LinearLayout) findViewById(R.id.panContent);
for (EntryModel m : this.entries) {
ViewGroup g = new LinearLayout(this);
getLayoutInflater().inflate(R.layout.entry, g);
/* ... populating data in the TextView and ImageView ... */
panContent.addView(g);
}
}
Наконец, вот обработчики onClick
:
public void showMore(View v) {
RelativeLayout container = (RelativeLayout) v.getParent();
View txt = container.findViewById(R.id.txtSynopsis);
RelativeLayout.LayoutParams sLayout =
(RelativeLayout.LayoutParams) txt.getLayoutParams();
sLayout.addRule(RelativeLayout.ALIGN_BOTTOM, 0);
container.findViewById(R.id.imgFade).setVisibility(View.GONE);
container.findViewById(R.id.imgLess).setVisibility(View.VISIBLE);
v.setVisibility(View.GONE);
txt.setLayoutParams(sLayout);
}
public void showLess(View v) {
RelativeLayout container = (RelativeLayout) v.getParent();
View txt = container.findViewById(R.id.txtSynopsis);
RelativeLayout.LayoutParams sLayout =
(RelativeLayout.LayoutParams) txt.getLayoutParams();
sLayout.addRule(RelativeLayout.ALIGN_BOTTOM, R.id.btnAction);
container.findViewById(R.id.imgFade).setVisibility(View.VISIBLE);
container.findViewById(R.id.imgMore).setVisibility(View.VISIBLE);
v.setVisibility(View.GONE);
txt.setLayoutParams(sLayout);
}
В основном:
- когда я нажимаю изображение «показать больше», отсоединяем нижнюю часть
txtSynopsis
'(чтобы оно охватывало столько строк, сколько нужно), скрываем изображение (и маску затухания) и показываем изображение «меньше»;
- при нажатии "показать меньше", ну, восстановить вещи.
Вот и мы. Это работает безупречно (почти ...) для КАЖДОЙ ОДНОЙ ЗАПИСИ, но ПОСЛЕДНЕЙ !!!
Что происходит с этим:
- Я должен нажать ДВАЖДЫ на «показать больше», чтобы все заработало,
- Я должен дважды щелкнуть на «показать меньше»,
- тогда достаточно нажать ОДИН РАЗ на «показать больше», но
- Мне все еще нужно нажать ДВАЖДЫ на "показать меньше"!
Спасибо всем, любая помощь и полезное понимание высоко ценится.