So deaktivieren Sie das Klickereignis Framelayout hinter der Ansicht


78

Hier habe ich eine Ansicht Pager-Aktivität, die eine Bildansicht und 2 Überlagerungsleisten hat. Es gibt Overlay-Balken, die ich mit dem Layout der Android XML-Datei selbst erstellt habe.

Hier ist meine Anforderung so

1) Einmaliges Tippen auf die Bildansicht des Ansichtspagers beim ersten Mal = obere und untere Überlagerungsleiste des Rechtecks ​​anzeigen. 2) Einmaliges Tippen auf die Bildansicht des Ansichtspagers zum zweiten Mal = diese Überlagerungen ausblenden.

Dies sind beide Funktionen wie Android Gallary View Typ.

Aber hier, wenn diese obere und untere Layoutleiste zu diesem Zeitpunkt angezeigt wird, möchte ich nur Schaltflächen verwenden. Klicken Sie nur auf die Schaltflächen, die in diesem Layout deklariert sind.

Aber ich habe keinen Erfolg, um dieses Ziel zu erreichen.

Probleme

1) Wann top or bottom barist da, wenn ich auf klicken kann?next or previous Schaltfläche kann, als das Ereignis für das Einzelklick-Touch-Ereignis hinter der Bildansicht erforderlich ist? Und meine Leiste wird unsichtbar. 2) Will nur Schaltflächen deklarieren Ereignis nur 3) Vermeiden Sie das Klicken auf die Bildansicht, wenn ich die Überlagerungsleiste berühre.

Kurz gesagt, wenn meine obere und untere Bildleiste zu diesem Zeitpunkt angezeigt wird, findet kein Touh-Ereignis für die Bildansicht von der oberen und unteren Bildleiste statt. Ich kann auf die Bildansicht klicken, aber nicht anklickbar machen, wenn ich auf die Schaltfläche "Weiter" oder "Zurück" oder "Teilen" klicke.

Das sind also die Probleme, mit denen ich konfrontiert bin. Bitte helfen Sie mir.

Quellcode :

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

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

    }
}

Bild :

Geben Sie hier die Bildbeschreibung ein

Vielen Dank


6
Warum stimmt jemand ab?
sam_k

Ich weiß, dass dies 5 Jahre zu spät ist, aber ich habe festgestellt, dass Ihr Homescreen ein Fragment sein sollte. Fügen Sie 'activity_main' oder 'content_main' keine anderen Steuerelemente hinzu als ein Framelayout, um Fragmente zu speichern. Das Hinzufügen von Steuerelementen zum Layout der Hauptaktivität führt dazu, dass überlagerte Fragmente Ereignisse für die Steuerelemente der Hauptaktivität auslösen, wenn dieselben Koordinaten gedrückt werden. Setzen Sie das übergeordnete Layout jedes Fragments auf 'android: clickable = "true"'.
Smitty-Werben-Jäger-Manjenson

Antworten:


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

293

Eine bessere Möglichkeit besteht darin, den oberen und unteren Rahmen so einzustellen, dass sie anklickbar sind.

android:clickable="true"

Dadurch wird sichergestellt, dass die Ansicht / der Rahmen selbst alle Klickereignisse abfängt und nicht durch die dahinterliegende Ansicht geleitet wird. Beachten Sie, dass diese Methode für alle Layouts / Ansichten / Steuerelemente funktioniert, aber viele Steuerelemente (z. B. Schaltflächen) haben diese Funktion standardmäßig bereits aktiviert.


8
Dies funktioniert nur, wenn die untere Ansicht keine Schaltfläche ist. Andernfalls nimmt die Schaltfläche das Klickereignis immer noch auf.
YongsunCN

3
Sollte die akzeptierte Antwort sein. Die aktuell akzeptierte Antwort ist ein Hack
Pierre

5
Nun, funktioniert bei mir nicht, die Listenansicht dahinter wird immer noch abgehört
Starwave

Um dies zu testen, wenn Sie Accessiblity / Talkback aktivieren, sehen Sie die ausgewählten Elemente auf der Rückseite des Bildschirms
Ahmed

1
Ja, diese Lösung funktioniert einwandfrei. Beachten Sie jedoch, dass die Ansicht als anklickbar angezeigt wird, wenn Sie den Talkback-Modus implementieren müssen. Daher kann es für einige Benutzer, die sich auf Talkback verlassen, verwirrend sein.
Volodymyr Buberenko

18

android:clickable="true" für obere und untere Leiste.

oder geben Sie jedem FrameLayouteine onClickListener.


14

Fügen Sie dies einfach zu jedem Ihrer Framelayout-Ansichtsbehälter hinzu, damit der Klick absorbiert wird:

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

8

Standardmäßig haben einige Steuerelemente die clickableEigenschaft as true. Aber das Layout nicht. Für das Layout müssen sie explizit anklickbar gemacht werden, damit die Ereignisse von Klicks oder Berührungen erfasst werden und nicht in Hintergrundansichten übertragen werden. So machen wir es:

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

Fügen Sie diese Linien allen Ihren Layouts hinzu, damit Ereignisse erfasst / absorbiert werden und nicht in Hintergrundansichten übertragen werden.


5

@ gordon1hd1 Antwort ist richtig, aber für diejenigen, die immer noch verwirrt sind, füge ich mein Layout hinzu, das a FrameLayoutals Eltern und a LinearLayoutund zwei ImageViewsals Kinder enthält.

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

Zuvor wurden Linearlayoutauch Berührungsereignisse abgefangen, wenn einer von beiden ImageViewsgedrückt wurde. Durch Hinzufügen android:clickable="true"zu beiden wurde ImageViewsdas Problem behoben.

Wenn Sie auch mit dieser Art von Problem konfrontiert sind, fügen Sie android:clickable="true"der Ansicht hinzu, dass Sie das Klickereignis abfangen möchten.


3

Setzen Sie einfach android: clickable = "true" in XML in Ihre Vordergrundansicht.


2

Hinzufügen android:clickable="true"zu rl_bottom_overlayund rl_top_overlay. Wenn Sie keine Klickereignisse für diese Layouts festlegen (oder weder programmgesteuert über XML), werden in Hintergrundansichten keine Ereignisse ausgelöst.


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>

und

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();
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.