Добавление фрагмента поверх другого фрагмента onClickListener

Я добавляю фрагмент к активности вместо , заменяя текущий фрагмент (потому что это соответствует типу поведения, которое я хочу иметь).

Моя проблема заключается в том, что щелчок в месте на верхнем фрагменте (тот, который отображается в данный момент), где находится вид в невидимом фрагменте, вызывает событие 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();
    ...
}

Ответы

Ответ 1

Вы можете просто добавить следующий атрибут к корневому расположению XML фрагмента, который был сверху, -

android:clickable="true"

Это гарантирует, что события касания не будут распространяться дальше верхнего уровня.

Ответ 2

Если вы добавляете фрагмент, он будет перекрывать все фрагменты под ним. Поэтому, если вы хотите одновременно отображать оба представления, это способ сделать это. Естественно, что оба представления присутствуют и будут прослушивать события касания. Если вы хотите сохранить фрагмент, но не показывать его, используйте:

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.
}

Ответ 3

Хорошо, я думаю, что лучший способ установить 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) {
        }
    });