ビュークリックイベントFramelayoutを無効にする方法
ここには、1つの画像ビューと2つのオーバーレイバーを持つ1つのビューページャーアクティビティがあります。 Android xmlファイルレイアウト自体を使用して作成したオーバーレイバーがあります。
ここで私の要件はそのようなものです
1)初めてページャーの画像ビューをシングルタップする=上下の長方形オーバーレイバーを表示します。 2)ビューページャーの画像ビューを2回シングルタップする=これらのオーバーレイを非表示にします。
これらは両方ともAndroidギャラリービュータイプのような関数です。
しかし、ここでこれらの上部と下部のレイアウトバーがその時に表示されるとき、ボタンのみを使用したい場合は、このレイアウト内で宣言されているボタンのみをクリックします。
しかし、私はこのことを達成するために成功を得ていません。
問題点
1)top or bottom bar
が存在する場合、next or previous
ボタンをクリックして、imageviewシングルタップタッチイベントの背後のイベントを取るよりも、そしてバーが見えなくなります。 2)ボタンイベントのみを宣言したい3)オーバーレイバーにタッチしたときにimageviewがクリックされるのを避ける。
要するに、その時点で私の上部と下部の画像バーが表示されたとき、上部と下部の画像バーからの画像表示のイベントは発生しません。 imageviewをクリックすることはできますが、実際に次または前のボタンまたは共有ボタンをクリックしたときにクリック可能にできません.
これらは私が直面している問題です。助けてください。
ソースコード :
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コード
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) {
}
}
}
画像:
ありがとう
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);
}
}
});
より良い方法は、上下のフレームをクリック可能に設定することです:
Android:clickable="true"
そうすることで、ビュー/フレーム自体がすべてのクリックイベントをトラップし、その背後のビューを通過しないようにします。このメソッドはすべてのレイアウト/ビュー/コントロールで機能しますが、多くのコントロール(ボタンなど)はデフォルトですでにこの機能をオンにしていることに注意してください。
Android:clickable="true"
上部および下部バー用。
または、それぞれFrameLayout
とonClickListener
を指定します。
@ gordon1hd1の答えは正しいですが、まだ混乱している人のために、FrameLayout
を親として、LinearLayout
とtwoImageViews
を子として含むレイアウトを追加しています。
<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>
以前は、Linearlayout
のいずれかが押されたときに、ImageViews
もタッチイベントをインターセプトしていました。 Android:clickable="true"
を両方のImageViews
に追加すると、問題は解決しました。
このタイプの問題にも直面している場合は、クリックイベントをトラップするビューにAndroid:clickable="true"
を追加します。
単純に、xmlでAndroid:clickable = "true"をフォアグラウンドビューに設定します。
クリックを吸収できるように、これを各フレームレイアウトビューコンテナに追加するだけです。
Android:clickable="true"
Android:focusable="true"
Android:focusableInTouchMode="true"
Android:clickable="true"
をrl_bottom_overlay
およびrl_top_overlay
に追加します。これらのレイアウトにクリックイベントを設定しない場合(プログラムでもXMLでも)、バックグラウンドビューでイベントはトリガーされません。
<?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>
そして
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();
}