Как отключить событие щелчка за просмотром Framelayout

Здесь у меня есть одно действие пейджера просмотра, которое имеет одно изображение и 2 панели наложения. есть накладные полосы, которые я сделал, используя сам макет файла Android xml.

Вот мое требование таково

1) одно касание при просмотре изображения пейджера в первый раз = показать верхнюю и нижнюю прямоугольную панель наложения. 2) однократное нажатие на изображение просмотра пейджера во второй раз = скрыть эти наложения.

Это обе функции, такие как тип просмотра галереи Android.

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

Но я не добиваюсь успеха в достижении этой цели.

Проблемы

1) когда top or bottom bar есть, если я могу нажать кнопку next or previous, чем происходит событие для события касания одним нажатием за просмотром изображения, и моя панель становится невидимой. 2) Требуется только объявить событие кнопок 3) Избегайте нажатия на изображение, когда я касаюсь панели наложения.

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

Итак, вот проблемы, с которыми я сталкиваюсь, пожалуйста, помогите мне.

Исходный код :

activity_pager_image.xml

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

    <android.support.v4.view.ViewPager
        android:id="@+id/pager"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" />

    <RelativeLayout
        android:id="@+id/rl_top_overlay"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:background="@drawable/slideshow_bar"
        android:visibility="gone" >

        <TextView
            android:id="@+id/tv_top_overlay"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true"
            android:layout_centerVertical="true"
            android:textIsSelectable="false" />
    </RelativeLayout>

    <RelativeLayout
        android:id="@+id/rl_bottom_overlay"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom"
        android:background="@drawable/slideshow_bar"
        android:visibility="visible" >

        <Button
            android:id="@+id/btn_left_arrow"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:layout_centerVertical="true"
            android:layout_marginLeft="35dp"
            android:background="@drawable/ic_left_arrow" />

        <Button
            android:id="@+id/btn_below_share"
            style="@style/normalText"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:layout_centerVertical="true"
            android:layout_marginRight="35dp"
            android:background="@drawable/ic_share"
            android:visibility="visible" />

        <Button
            android:id="@+id/btn_right_arrow"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true"
            android:layout_centerVertical="true"
            android:layout_marginLeft="50dp"
            android:layout_toRightOf="@id/btn_left_arrow"
            android:background="@drawable/ic_right_arrow" />
    </RelativeLayout>

</FrameLayout>

item_pager_image.xml

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

    <demo.android.library.imagezoom.ImageViewTouch
        android:id="@+id/image"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:adjustViewBounds="true"
        android:contentDescription="@string/descr_image"
        android:scaleType="fitXY" />

</FrameLayout>

JAVA-код

public class ImagePagerActivity extends BaseActivity {

    private static final String STATE_POSITION = "STATE_POSITION";
    private DisplayImageOptions options;
    private String[] imageUrls;
    private ViewPager pager;

    private static int sCounter = 0;

    private RelativeLayout mRlTopOverlayBar = null;
    private RelativeLayout mRlBottomOverlayBar = null;
    private TextView mPageNumberText = null;
    private Button mLeftArrow = null;
    private Button mRightArrow = null;

    int mPageCounter = 0;
    int mTotalImages = 0;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_image_pager);

        mRlTopOverlayBar = (RelativeLayout) findViewById(R.id.rl_top_overlay);
        mRlBottomOverlayBar = (RelativeLayout) findViewById(R.id.rl_bottom_overlay);

        mPageNumberText = (TextView) findViewById(R.id.tv_top_overlay);
        mLeftArrow = (Button) findViewById(R.id.btn_left_arrow);
        mRightArrow = (Button) findViewById(R.id.btn_right_arrow);

        Bundle bundle = getIntent().getExtras();
        String[] imageUrls = bundle
                .getStringArray(Constants.GALLARY_IMAGES_IMAGE_BUNDLE_KEY);

        mTotalImages = imageUrls.length;

        mPageCounter = bundle.getInt(
                Constants.GALLARY_IMAGE_POSITION_BUNDLE_KEY, 0);

        Log.d("TAG", "Pre Poistion " + mPageCounter);

        if (savedInstanceState != null) {
            mPageCounter = savedInstanceState.getInt(STATE_POSITION);
        }

        options = new DisplayImageOptions.Builder()
                .showImageForEmptyUri(R.drawable.photo_default)
                .showImageOnFail(R.drawable.ic_error).resetViewBeforeLoading()
                .cacheOnDisc().imageScaleType(ImageScaleType.EXACTLY)
                .bitmapConfig(Bitmap.Config.RGB_565)
                .displayer(new FadeInBitmapDisplayer(300)).build();

        pager = (ViewPager) findViewById(R.id.pager);
        pager.setAdapter(new ImagePagerAdapter(imageUrls));
        pager.setCurrentItem(mPageCounter);

        mLeftArrow.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // int setCounter = mPageCounter - 1;
                // if (setCounter >= 0) {

                // }
                pager.setCurrentItem(pager.getCurrentItem() - 1);

            }
        });

        mRightArrow.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                pager.setCurrentItem(pager.getCurrentItem() + 1);
                /*
                 * int setCounter = mPageCounter + 1; if (setCounter <
                 * mTotalImages) { pager.setCurrentItem(mPageCounter + 1); }
                 */
            }
        });
    }

    @Override
    public void onSaveInstanceState(Bundle outState) {
        outState.putInt(STATE_POSITION, pager.getCurrentItem());
    }

    private class ImagePagerAdapter extends PagerAdapter {

        private String[] images;
        private LayoutInflater inflater;

        ImagePagerAdapter(String[] images) {
            this.images = images;
            inflater = getLayoutInflater();
        }

        @Override
        public void destroyItem(ViewGroup container, int position, Object object) {
            ((ViewPager) container).removeView((View) object);
        }

        @Override
        public void finishUpdate(View container) {
        }

        @Override
        public int getCount() {
            return images.length;
        }

        @Override
        public Object instantiateItem(ViewGroup view, int position) {
            View imageLayout = inflater.inflate(R.layout.item_pager_image,
                    view, false);

            Log.d("TAG", "Poistion " + position);
            final ImageViewTouch imageView = (ImageViewTouch) imageLayout
                    .findViewById(R.id.image);

            final DeactivableViewPager viewPager = new DeactivableViewPager(
                    ImagePagerActivity.this);
            imageView.setOnScaleListener(new OnPageScaleListener() {

                @Override
                public void onScaleBegin() {
                    viewPager.deactivate();
                }

                @Override
                public void onScaleEnd(float scale) {
                    if (scale > 1.0) {
                        viewPager.deactivate();
                    } else {
                        viewPager.activate();
                    }
                }
            });

            imageView
                    .setSingleTapListener(new OnImageViewTouchSingleTapListener() {

                        @Override
                        public void onSingleTapConfirmed() {
                            Log.d("TAG", "setSingleTapListener");

                            sCounter++;
                            if (sCounter % 2 == 0) {
                                mRlTopOverlayBar.setVisibility(View.GONE);
                                mRlBottomOverlayBar.setVisibility(View.GONE);
                            } else {
                                mRlTopOverlayBar.setVisibility(View.VISIBLE);
                                mRlBottomOverlayBar.setVisibility(View.VISIBLE);
                                mRlBottomOverlayBar.setClickable(false);
                                mRlTopOverlayBar.setClickable(false);
                            }
                        }
                    });

            imageLoader.displayImage(images[position], imageView, options,
                    new SimpleImageLoadingListener() {
                        @Override
                        public void onLoadingStarted(String imageUri, View view) {
                            // spinner.setVisibility(View.VISIBLE);
                        }

                        @Override
                        public void onLoadingFailed(String imageUri, View view,
                                FailReason failReason) {
                            String message = null;
                            switch (failReason.getType()) {
                            case IO_ERROR:
                                message = "Input/Output error";
                                break;
                            case DECODING_ERROR:
                                message = "Image can't be decoded";
                                break;
                            case NETWORK_DENIED:
                                message = "Downloads are denied";
                                break;
                            case OUT_OF_MEMORY:
                                message = "Out Of Memory error";
                                break;
                            case UNKNOWN:
                                message = "Unknown error";
                                break;
                            }
                            Toast.makeText(ImagePagerActivity.this, message,
                                    Toast.LENGTH_SHORT).show();

                            // spinner.setVisibility(View.GONE);
                        }

                        @Override
                        public void onLoadingComplete(String imageUri,
                                View view, Bitmap loadedImage) {
                            // spinner.setVisibility(View.GONE);
                        }
                    });

            ((ViewPager) view).addView(imageLayout, 0);
            return imageLayout;
        }

        @Override
        public boolean isViewFromObject(View view, Object object) {
            return view.equals(object);
        }

        @Override
        public void restoreState(Parcelable state, ClassLoader loader) {
        }

        @Override
        public Parcelable saveState() {
            return null;
        }

        @Override
        public void startUpdate(View container) {
        }

    }
}

изображение:

введите описание изображения здесь

Благодарность


person sam_k    schedule 04.05.2013    source источник
comment
почему кто-то понижает голос?   -  person sam_k    schedule 05.05.2013
comment
Я знаю, что опоздал на 5 лет, но я обнаружил, что ваш домашний экран должен быть фрагментом. Не добавляйте в «activity_main» или «content_main» элементы управления, кроме макета фрейма, для хранения фрагментов. Добавление элементов управления в макет основного действия приведет к тому, что наложенные фрагменты будут запускать события для элементов управления основного действия при нажатии одних и тех же координат. Установите для родительского макета каждого фрагмента значение «android: clickable = true».   -  person Smitty-Werben-Jager-Manjenson    schedule 13.11.2018


Ответы (8)


Лучший способ — сделать верхнюю и нижнюю рамку кликабельными с помощью:

android:clickable="true"

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

person gordon1hd1    schedule 19.10.2014
comment
Это работает, только если нижний вид не является кнопкой. В противном случае кнопка по-прежнему получает событие щелчка. - person yongsunCN; 10.10.2016
comment
Должен быть принятый ответ. Текущий принятый ответ - взлом - person Pierre; 29.03.2017
comment
Ну, у меня не работает, список за ним все еще прослушивается - person Starwave; 13.06.2017
comment
Чтобы проверить это, если вы включите Accessiblity / Talkback, вы увидите элементы, выбранные на задней части экрана. - person Ahmed; 06.09.2017
comment
Есть ли способ сделать это программно? - person Kaspis245; 25.05.2018
comment
в этом случае.. Я согласен, что щелчок захвачен... но эффект пульсации проявляется, когда мы добавляем clickalbe true к линейному или относительному макету - person Kannan_SJD; 21.03.2019
comment
@Kaspis245 Конечно, используйте view.setClickable(true), см. здесь - developer.android.com /ссылка/андроид/представление/ - person Vadim Kotov; 26.09.2019
comment
Да, это решение работает нормально, но имейте в виду, что если вам нужно реализовать режим Talkback, он объявит вид как интерактивный. Так что это может сбить с толку некоторых пользователей, которые полагаются на Talkback. - person Volodymyr Buberenko; 09.10.2019

android:clickable="true" для верхней и нижней панели.

или дайте каждому FrameLayout onClickListener.

person burulangtu    schedule 08.01.2016

просто добавьте это в каждый из ваших контейнеров представления framelayout, чтобы поглотить щелчок:

  android:clickable="true"
    android:focusable="true"
    android:focusableInTouchMode="true"
person j2emanue    schedule 14.02.2019

По умолчанию некоторые элементы управления имеют свойство clickable как true. Но макета нет. Для макета мы должны сделать их явно интерактивными, чтобы он перехватывал события кликов или касаний и не позволял им переходить в фоновые представления. Вот как мы это делаем:

android:clickable="true"
android:focusable="true"
android:focusableInTouchMode="true"

Добавьте эти строки во все ваши макеты, чтобы он перехватывал/поглощал события и не позволял им переходить в фоновые представления.

person Wajid    schedule 03.01.2020

Ответ @ gordon1hd1 правильный, но для тех, кто все еще запутался, я добавляю свой макет, который содержит FrameLayout в качестве родителя и LinearLayout и twoImageViews в качестве дочерних элементов.

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content">         
     <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:id="@+id/scroll_parent"
            android:orientation="horizontal" />
    <ImageView
        android:id="@+id/ivArrowLeft"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="4dp"
        android:src="@drawable/actionbar_back"
        android:layout_gravity="left|center_vertical"
        android:background="#3f808080"
        android:clickable="true"
        />
    <ImageView
        android:id="@+id/ivArrowRight"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginRight="4dp"
        android:src="@drawable/actionbar_back"
        android:layout_gravity="right|center_vertical"
        android:background="#3f808080"
        android:rotation="180"
        android:clickable="true"
        />
</FrameLayout>

Ранее Linearlayout также перехватывал события касания при нажатии любой из ImageViews. Добавление android:clickable="true" к обоим ImageViews решило проблему.

Если вы также столкнулись с проблемой такого типа, добавьте android:clickable="true" к представлению, в котором вы хотите перехватывать событие щелчка.

person Rohan Kandwal    schedule 12.02.2015

Просто установите android:clickable="true" в xml на передний план.

person Vivek Hande    schedule 02.12.2017

Добавьте android:clickable="true" к rl_bottom_overlay и rl_top_overlay. Если вы не установите события щелчка для этих макетов (ни через XML, ни программно), никакие события не будут запускаться в фоновых представлениях.

person Garry Dias    schedule 04.08.2018

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout android:id="@+id/llSettings"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_gravity="right"
    android:background="#ff106279"
    android:minHeight="25px"
    android:minWidth="25px"
    android:onClick="click"
    android:orientation="vertical"
    android:visibility="visible">

    <LinearLayout
        android:id="@+id/llSettings1"
        android:layout_width="200dp"
        android:layout_height="match_parent"
        android:layout_gravity="right"
        android:background="#ff000f"
        android:clickable="true"
        android:minHeight="25px"
        android:minWidth="25px"
        android:orientation="vertical"
        android:visibility="visible">

        <Button
            android:id="@+id/button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:onClick="buttonclick"
            android:text="New Button" />
    </LinearLayout>
</RelativeLayout>

и

public void click(View v) {
    Toast.makeText(this, "((RelativeLayout)v).toString()", Toast.LENGTH_SHORT).show();
}

public void buttonclick(View v) {
    Toast.makeText(this, "Button", Toast.LENGTH_SHORT).show();
}
person Vijay Sonawane    schedule 19.09.2016