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 bar
ist 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 :
Vielen Dank
Antworten:
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); } } });
quelle
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.
quelle
android:clickable="true"
für obere und untere Leiste.oder geben Sie jedem
FrameLayout
eineonClickListener
.quelle
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"
quelle
Standardmäßig haben einige Steuerelemente die
clickable
Eigenschaft astrue
. 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.
quelle
@ gordon1hd1 Antwort ist richtig, aber für diejenigen, die immer noch verwirrt sind, füge ich mein Layout hinzu, das a
FrameLayout
als Eltern und aLinearLayout
und zweiImageViews
als 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
Linearlayout
auch Berührungsereignisse abgefangen, wenn einer von beidenImageViews
gedrückt wurde. Durch Hinzufügenandroid:clickable="true"
zu beiden wurdeImageViews
das 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.quelle
Setzen Sie einfach android: clickable = "true" in XML in Ihre Vordergrundansicht.
quelle
Hinzufügen
android:clickable="true"
zurl_bottom_overlay
undrl_top_overlay
. Wenn Sie keine Klickereignisse für diese Layouts festlegen (oder weder programmgesteuert über XML), werden in Hintergrundansichten keine Ereignisse ausgelöst.quelle
<?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(); }
quelle