studio programacion para móviles libro edición desarrollo desarrollar curso aprende aplicaciones android android-layout android-viewpager framelayout android-gui

android - programacion - Cómo deshabilitar detrás del evento click de vista Framelayout



manual de programacion android pdf (6)

Aquí tengo una actividad de paginador de vista que tiene una vista de imagen y 2 barras de superposición. Hay barras de superposición que hice usando el diseño de archivo xml de Android.

Aquí mi requisito es así

1) un solo toque en la vista de la imagen del buscapersonas primera vez = muestra la barra de superposición del rectángulo superior e inferior. 2) toque solo en la vista de la imagen del buscapersonas segunda vez = oculte estas superposiciones.

Estas dos funciones son como el tipo de vista gallary de Android.

Pero aquí cuando estas barras de diseño superior e inferior se muestran en ese momento, quiero usar solo botones, solo haga clic en los botones que se declaran dentro de este diseño.

Pero no estoy teniendo éxito para lograr esto.

Problemas

1) cuando la top or bottom bar está allí si puedo hacer clic en el botón next or previous que su evento toma para detrás de la imagen vista toque solo toque evento, y mi barra se está volviendo invisible. 2) Solo quiere declarar el evento de solo botones 3) Evitar que se haga clic en la vista de imagen cuando toco la barra de superposición.

En resumen, cuando aparece la barra de imágenes superior e inferior en ese momento, no se produce ningún evento touh para la vista de la imagen desde la barra de imágenes superior e inferior. Puedo hacer clic en la vista de imagen pero no hacer clic cuando hago clic en el botón actualmente siguiente o anterior o compartir.

Estos son los problemas que estoy enfrentando. Por favor, ayúdenme.

Código fuente :

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>

Código 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) { } } }

imagen:

Gracias


@ gordon1hd1 la respuesta es correcta, pero para aquellos que todavía están confundidos, estoy agregando mi diseño que contiene un FrameLayout como principal y un LinearLayout y dos ImageViews como elementos secundarios.

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

Anteriormente, Linearlayout también interceptaba eventos táctiles cuando se presionaba ImageViews . Al agregar android:clickable="true" ambos ImageViews resolvieron el problema.

Si también enfrenta este tipo de problema, agregue android:clickable="true" a la vista que desea atrapar el evento de clic.


Simplemente, establece android: clickable = "true" en xml a tu vista en primer plano.


Una mejor manera es configurar el marco superior e inferior para hacer clic, con:

android:clickable="true"

Al hacerlo, se asegurará de que la vista / marco en sí atrape todos los eventos de clic y no lo pase a través de la vista detrás de él. Tenga en cuenta que este método funciona para todos los diseños / vistas / controles, pero muchos controles (como botones) ya tienen esta función activada por defecto.


android:clickable="true" para la barra superior e inferior.

o darle a cada FrameLayout un onClickListener .


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


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

y

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