Ответ 1
Вы можете просто добавить следующий атрибут к корневому расположению XML фрагмента, который был сверху, -
android:clickable="true"
Это гарантирует, что события касания не будут распространяться дальше верхнего уровня.
Я добавляю фрагмент к активности вместо , заменяя текущий фрагмент (потому что это соответствует типу поведения, которое я хочу иметь).
Моя проблема заключается в том, что щелчок в месте на верхнем фрагменте (тот, который отображается в данный момент), где находится вид в невидимом фрагменте, вызывает событие onClick на представлении во втором, невидимом фрагменте, чтобы стрелять. Почему это происходит и как я могу предотвратить это?
Это код, который я использую для первого добавления фрагмента ListView в действие:
@Override
protected void onCreate(Bundle savedInstanceState) {
...
if (savedInstanceState == null) {
listFragment = new ListFragment ();
getSupportFragmentManager().beginTransaction()
.add(R.id.frame_container, listFragment)
.addToBackStack(listFragment .TAG)
.commit();
}
...
}
В этом же упражнении я добавляю второй фрагмент поверх фрагмента списка:
@Override
protected void onActivityResult(int requestCode, int resultCode,
Intent data) {
...
createItemFragment = new CreateItemFragment();
getSupportFragmentManager().beginTransaction()
.add(R.id.frame_container, createItemFragment)
.addToBackStack(createItemFragment.TAG)
.commit();
...
}
Вы можете просто добавить следующий атрибут к корневому расположению XML фрагмента, который был сверху, -
android:clickable="true"
Это гарантирует, что события касания не будут распространяться дальше верхнего уровня.
Если вы добавляете фрагмент, он будет перекрывать все фрагменты под ним. Поэтому, если вы хотите одновременно отображать оба представления, это способ сделать это. Естественно, что оба представления присутствуют и будут прослушивать события касания. Если вы хотите сохранить фрагмент, но не показывать его, используйте:
FragmentTransaction ft = getFragmentManager().beginTransaction()
ft.detach(fragment).commit();
Это позволит удалить представление фрагментов без уничтожения фрагмента.
вы можете позвонить
FragmentTransaction ft = getFragmentManager().beginTransaction()
ft.attach(fragment).commit();
чтобы снова привязать его к представлению.
В качестве альтернативы вы можете просто изменить свой прослушиватель кликов на
public void onClick (View v){
if(!v.isShown()){
return;
}
//Stuff the listener should do.
}
Хорошо, я думаю, что лучший способ установить onClickListener в locateView, который вы нажимаете на верхнем фрагменте.
если вы используете способ андроид: clickable = "true", отвеченный The Metal Beard, а также вы устанавливаете состояния ImageView селектор (см. ниже), то вы найдете ошибка: если вы нажмете другое место, изображение будет изменить статус.
<ImageView
android:id="@+id/mCollect"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/specialprice_collect_selector" />
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/specialprice_collect_p" android:state_pressed="true"/>
<item android:drawable="@drawable/specialprice_collect_n"/>
</selector>
если щелкнул View на верхнем фрагменте mBootomLayout, просто выполните его следующим образом:
mBootomLayout.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
}
});