web-dev-qa-db-fra.com

Comment désactiver l'événement de clic derrière la vue Framelayout

Ici, j'ai une activité de pager de vue qui a une imageview et 2 barres de superposition. il ya des barres de superposition que j’ai faites en utilisant la mise en page de fichier Android xml.

Ici mon exigence est comme ça 

1) appuyer une seule fois sur la vue image du pager de vue pour la première fois = afficher la barre de superposition rectangle supérieure et inférieure . 2) appuyer une seconde fois sur la vue de l'image du pageur vue = masquer ces incrustations.

Ces deux sont des fonctions comme type de vue gallary Android.

Mais ici, lorsque ces barres de présentation supérieure et inférieure s'affichent à ce moment-là, je souhaite utiliser uniquement des boutons. Cliquez uniquement sur les boutons déclarés dans cette présentation.

Mais je n'obtiens pas le succès pour réaliser cette chose.

Problèmes 

1) quand top or bottom bar est là si je peux cliquer sur le bouton next or previous puis que son événement prend pour derrière un événement tactile avec une seule image touch, Et ma barre devient invisible . 2) Ne veut que déclarer des boutons, uniquement un événement se cliqué quand je touche à la barre de superposition.

En bref, lorsque ma barre d’image supérieure et inférieure apparaît à ce moment-là, aucun événement n’a lieu pour la visualisation d’image à partir de la barre d’image supérieure et inférieure. Je peux cliquer sur imageview mais ne pas rendre cliquable lorsque je clique sur le bouton réellement suivant ou précédent ou le bouton de partage.

Donc, ce sont les problèmes que je suis confronté, aidez-moi s'il vous plaît.

Code source :

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>

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

    }
}

image:

 enter image description here

merci

60
sam_k
 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);
                        }
                    }
                });
2
PiyushMishra

Un meilleur moyen consiste à définir les cadres supérieur et inférieur de manière à ce qu'ils soient cliquables, avec:

Android:clickable="true"

Cela garantira que la vue/le cadre lui-même capturera tous les événements de clic et ne le transmettra pas à travers la vue située derrière. Notez que cette méthode fonctionne pour tous les modèles/vues/contrôles, mais de nombreux contrôles (tels que les boutons) ont déjà cette fonction activée par défaut.

244
gordon1hd1

Android:clickable="true" pour les barres supérieure et inférieure.

ou donnez à chaque FrameLayout une onClickListener.

14
burulangtu

La réponse de @ gordon1hd1 est correcte mais pour ceux qui sont encore confus, j'ajoute ma mise en page qui contient un FrameLayout en tant que parent et un LinearLayout et deuxImageViews en tant qu'enfants.

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

Auparavant, la Linearlayout interceptait également des événements tactiles lorsque l'un des ImageViews était enfoncé. L'ajout de Android:clickable="true" aux deux ImageViews a résolu le problème.

Si vous rencontrez également ce type de problème, ajoutez Android:clickable="true" à la vue que vous souhaitez intercepter l'événement en cliquant.

5
Rohan Kandwal

Définissez simplement Android: clickable = "true" au format xml dans votre vue de premier plan.

3
Vivek Hande

Ajoutez Android:clickable="true" à rl_bottom_overlay et rl_top_overlay. Si vous ne définissez pas les événements de clic sur ces présentations (ni via XML ni par programme), aucun événement ne sera déclenché sur les vues en arrière-plan.

0
user3810036
<?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>

et 

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();
}
0
Vijay Sonawane

il suffit d’ajouter ceci à chacun de vos conteneurs de vue Framelayout pour absorber le clic:

  Android:clickable="true"
    Android:focusable="true"
    Android:focusableInTouchMode="true"
0
j2emanue