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:
merci
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);
}
}
});
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.
Android:clickable="true"
pour les barres supérieure et inférieure.
ou donnez à chaque FrameLayout
une onClickListener
.
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.
Définissez simplement Android: clickable = "true" au format xml dans votre vue de premier plan.
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.
<?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();
}
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"