How to disable click tracking on Framelayout event

Here I have one pager activity in a view that has one image view and 2 overlap bars. There are overlay bars that I made using the very layout of the xroid file.

Here my requirement is similar to

1) a single click on viewing the pager image for the first time = show the upper and lower panels of the rectangle overlap. 2) a single click on viewing the pager image a second time = hide these overlays.

These functions are functions like the galactic view of Android.

But here, when the top and bottom panels of the layout are displayed, I want to use only the buttons, only those buttons that are declared in this layout.

But I did not succeed in achieving this goal.

Problems

1) when there is a top or bottom bar , if I can click on the next or previous button, than the event accepts an event for the touch touch event for one image, and my bar becomes invisible. 2) Only wants to declare only event buttons 3) Avoid accessing images when clicking on the overlap panel.

In short, when the upper and lower panel of images appears, the touh event does not occur at this time to view the images above and below. I can click on the image, but not clickable when I click on the "Next" or "previous" or "Share" button.

So these are the problems I encountered, please help me.

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> 

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

! [enter image description here] [1] image: enter image description here

thank

+45
android android-layout android-viewpager framelayout android-gui
May 04 '13 at 18:28
source share
6 answers
  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
May 05 '13 at 6:45
source share

It’s best to set the upper and lower frames for clickability using:

 android:clickable="true" 

When doing this, make sure that the view / frame itself will capture all click events and will not pass it through the view behind it. Note that this method works for all layouts / views / controls, but many controls (such as buttons) already have this feature by default.

+196
Oct 19 '14 at 23:31
source share

android:clickable="true" for the top and bottom panels.

or give each FrameLayout an onClickListener .

+11
Jan 08 '16 at 2:48 on
source share

@ gordon1hd1 the answer is correct, but for those who are still confused, I add my layout, which contains FrameLayout as a parent and LinearLayout and two ImageViews as children.

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

Previously, LinearLayout also intercepted touch events when any of ImageViews clicked. Adding android:clickable="true" to both ImageViews fixes the problem.

If you encounter this type of problem, add android:clickable="true" to the view that you want to catch the click event.

+5
Feb 12 '15 at 10:59
source share
 <?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> 

and

 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
Sep 19 '16 at 13:24
source share

Just set Setroid: clickable = "true" in xml in the foreground view.

0
Dec 02 '17 at 13:22
source share



All Articles