Як вимкнути затримку кліку подання Framelayout


79

Тут у мене є одна діяльність перегляду пейджера, яка має один перегляд зображення та 2 смуги накладання. там накладені смуги, які я зробив, використовуючи сам макет файлу android xml.

Тут моя вимога така

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

Це обидві функції, такі як тип андроїд-галері.

Але тут, коли ці верхній та нижній рядки макета відображаються в той час, я хочу використовувати лише кнопки, клацніть лише ті кнопки, які оголошені в цьому макеті.

Але я не досягаю успіху, щоб досягти цієї справи.

Проблеми

1) коли top or bottom barє, якщо я можу натиснути на next or previousкнопку, ніж це відбувається для події, що торкається зображення одним натисканням, і моя панель стає невидимою. 2) Потрібно лише оголосити лише подію кнопок 3) Уникайте натискання зображення, коли я торкаюся панелі накладання.

Коротше кажучи, коли в той час з’являється моя верхня та нижня панель зображень, жодна жорстка подія не відбувається для перегляду зображень із верхньої та нижньої панелі зображень. Я можу натиснути на перегляд зображення, але не роблю натискання, коли натискаю фактично наступну або попередню кнопку або кнопку спільного доступу.

Отже, це проблеми, з якими я стикаюся, будь ласка, допоможіть мені.

Вихідний код:

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) {
        }

    }
}

зображення:

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

Дякую


6
чому хтось голосує проти?
sam_k

Я знаю, що це запізнилося на 5 років, але я виявив, що ваш робочий стіл повинен бути фрагментом. Не додавайте елементи керування до 'Activity_main' або 'content_main', крім макета кадру, для зберігання фрагментів. Додавання елементів керування до макета основної діяльності призведе до накладання фрагментів на активацію подій для елементів керування основною діяльністю, коли натискаються ті самі координати. Встановіть для батьківського макета кожного фрагмента значення 'android: clickable = "true"'.
Smitty-Werben-Jager-Manjenson

Відповіді:


2
 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);
                            pager.requestFocus();
                        } else {
                            mRlTopOverlayBar.setVisibility(View.VISIBLE);
                            mRlBottomOverlayBar.setVisibility(View.VISIBLE);
                            mRlTopOverlayBar.requestFocus();
                            mRlBottomOverlayBar.requestFocus();
                            mRlBottomOverlayBar.setClickable(true);
                            mRlTopOverlayBar.setClickable(true);
                        }
                    }
                });

295

Кращий спосіб - встановити верхній і нижній кадр так, щоб вони могли натискатися, за допомогою:

android:clickable="true"

Це дозволить переконатися, що сам вигляд / кадр зафіксує всі клікові події, а не пропустить його через вигляд за ним. Зверніть увагу, що цей метод працює для всіх макетів / переглядів / елементів керування, але багато елементів керування (наприклад, кнопки) вже мають цю функцію за замовчуванням.


8
Це працює, лише якщо нижній вигляд не є кнопкою. В іншому випадку кнопка все ще піднімає клік.
yongsunCN

3
Має бути прийнятою відповіддю. Поточна прийнята відповідь - хакер
П'єр

5
Ну, це не працює для мене, список списку за ним все одно прослуховується
Starwave

Щоб перевірити це, якщо ви ввімкнете Accessiblity / Talkback, тоді ви побачите елементи, вибрані на тильній стороні екрана
Ахмед,

1
Так, це рішення працює нормально, але майте на увазі, що якщо вам потрібно реалізувати режим Talkback, він оголосить подання як клікабельне. Тож це може заплутати деяких користувачів, які покладаються на Talkback.
Володимир Буберенко

18

android:clickable="true" для верхньої та нижньої панелі.

або дати кожному FrameLayoutап onClickListener.


14

просто додайте це до кожного з ваших контейнерів подання фреймулайт, щоб воно сприйняло клацання:

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

8

За замовчуванням деякі елементи керування мають clickableвластивість як true. Але макет цього не робить. Для макету ми повинні зробити їх явними клацаннями, щоб вони захоплювали події кліків або дотиків і не дозволяли їм переходити до фонових видів. Ось як ми це робимо:

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

Додайте ці рядки до всіх своїх макетів, щоб вони захоплювали / поглинали події і не дозволяли їм переходити до фонових видів.


5

Відповідь @ gordon1hd1 правильна, але для тих, хто все ще розгублений, я додаю свій макет, який містить FrameLayoutяк батьківський, так LinearLayoutі два ImageViewsяк дочірні.

<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"до подання, яке ви хочете затримати подію клацання.


3

Просто встановіть android: clickable = "true" у форматі xml для вашого виду переднього плану.


2

Додайте android:clickable="true"до rl_bottom_overlayта rl_top_overlay. Якщо ви не встановите для цих макетів події кліків (ані за допомогою XML, ані програмно), жодні події не запускатимуться у фоновому режимі.


0
<?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();
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.