ScrollViewを有効にし、ボタンクリックで無効にします。
無効とは、ScrollViewが存在しない場合と同じように意味し、有効にするとScrollViewを返します。
テキスト画像のあるギャラリーがあり、ボタンをクリックすると画面の向きが変わるため、横向きではテキストが大きくなります。そして、ScrollViewが欲しいので、画像が伸びず、テキストが読めなくなります。
scrollview.Enabled=false / setVisibility(false)
は何も作成しません。
xml:
<ScrollView
Android:id="@+id/QuranGalleryScrollView"
Android:layout_height="fill_parent"
Android:layout_width="fill_parent">
<Gallery Android:id="@+id/Gallery"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent"
Android:scrollbars="horizontal"></Gallery>
</ScrollView>
ありがとう
Edit1:Visibility(なくなった)を使用することはできません。それはギャラリーも非表示にするためです。ScrollViewの効果を非表示にする必要があります。 ScrollViewがあると、Galleryの画像がscrollabaleになり、画面に収まらないため、画像全体を表示するためにスクロールする必要があります。ボタンのクリックで無効/有効にしたくありません。
私はこれを試しました:
((ScrollView)findViewById(R.id.QuranGalleryScrollView)).setOnTouchListener(null);
((ScrollView)findViewById(R.id.QuranGalleryScrollView)).setHorizontalScrollBarEnabled(false);
((ScrollView)findViewById(R.id.QuranGalleryScrollView)).setVerticalScrollBarEnabled(false);
((ScrollView)findViewById(R.id.QuranGalleryScrollView)).setEnabled(false);
ただし、ギャラリーの画像はスクロール可能であり、画面に収まりません。これに対する解決策は何ですか?
開始するいくつかのポイント:
onTouchEvent
メソッドをオーバーライドしてfalse
を返す必要があります。Android:scaleType
プロパティ(XML)またはsetScaleType
メソッドで変更できます-たとえば、ScaleType.CENTER
は画像を拡大せず、元のサイズで中央に配置しますスクロールを無効にするには、ScrollView
を次のように変更できます。
class LockableScrollView extends ScrollView {
...
// true if we can scroll (not locked)
// false if we cannot scroll (locked)
private boolean mScrollable = true;
public void setScrollingEnabled(boolean enabled) {
mScrollable = enabled;
}
public boolean isScrollable() {
return mScrollable;
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
// if we can scroll pass the event to the superclass
return mScrollable && super.onTouchEvent(ev);
default:
return super.onTouchEvent(ev);
}
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
// Don't do anything with intercepted touch events if
// we are not scrollable
return mScrollable && super.onInterceptTouchEvent(ev);
}
}
次に使用します
<com.mypackagename.LockableScrollView
Android:id="@+id/QuranGalleryScrollView"
Android:layout_height="fill_parent"
Android:layout_width="fill_parent">
<Gallery Android:id="@+id/Gallery"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent"
Android:scrollbars="horizontal">
</Gallery>
</com.mypackagename.LockableScrollView>
xMLファイルで(ScrollView
を特別なLockableScrollView
に変更しただけです)。
それから電話する
((LockableScrollView)findViewById(R.id.QuranGalleryScrollView)).setScrollingEnabled(false);
ビューのスクロールを無効にします。
目的の結果を達成するために、スクロールを無効にするだけでは問題がないと思います(たとえば、ギャラリーは上記のコードでスクロール可能のままになります)-3つのコンポーネント(ギャラリー、 ScrollView、ImageView)を使用して、各プロパティのプロパティと動作を確認します。
私はこのように行っていました:
scrollView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
return isBlockedScrollView;
}
});
設定したこのシンプルなソリューションが見つかりました
ScrollView.requestDisallowInterceptTouchEvent(true);
Disablend ScrollView
ScrollView sw = (ScrollView) findViewById(R.id.scrollView1);
sw.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
return true;
}
});
最初に、最初のコメントに投稿されたコードを使用しましたが、次のように変更しました。
public class LockableScrollView extends ScrollView {
public LockableScrollView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
// TODO Auto-generated constructor stub
}
public LockableScrollView(Context context, AttributeSet attrs)
{
super(context, attrs);
}
public LockableScrollView(Context context)
{
super(context);
}
// true if we can scroll (not locked)
// false if we cannot scroll (locked)
private boolean mScrollable = true;
public void setScrollingEnabled(boolean enabled) {
mScrollable = enabled;
}
public boolean isScrollable() {
return mScrollable;
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
// if we can scroll pass the event to the superclass
if (mScrollable) return super.onTouchEvent(ev);
// only continue to handle the touch event if scrolling enabled
return mScrollable; // mScrollable is always false at this point
default:
return super.onTouchEvent(ev);
}
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
// if we can scroll pass the event to the superclass
if (mScrollable) return super.onInterceptTouchEvent(ev);
// only continue to handle the touch event if scrolling enabled
return mScrollable; // mScrollable is always false at this point
default:
return super.onInterceptTouchEvent(ev);
}
}
}
それから私はこの方法でそれを呼び出しました
((LockableScrollView)findViewById(R.id.scrollV)).setScrollingEnabled(false);
試したから
((LockableScrollView)findViewById(R.id.scrollV)).setIsScrollable(false);
しかしsetIsScrollableは未定義
これがお役に立てば幸いです
私は答えにコメントするのに十分なポイントを持っていませんが、mikecの答えは私のために働いたと言いたかったです!
mScroller.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
return !isScrollable;
}
});
より簡単なソリューションを次に示します。 ScrollView
OnTouchListener
のonTouch()
をオーバーライドし、タッチによるスクロールをバイパスする場合はfalseを返します。プログラムによるスクロールは引き続き機能し、ScrollView
クラスを拡張する必要はありません。
mScroller.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
return isScrollable;
}
});
CustomScrollViewを作成して、他のビューとの干渉を無効にすることができます。ただし、これはエンドユーザーを苛立たせることがあります。注意して使用してください。
これはコードです:
import Android.content.Context;
import Android.util.AttributeSet;
import Android.view.MotionEvent;
import Android.view.ViewParent;
public class CustomScrollView extends Android.widget.ScrollView {
public CustomScrollView(Context context) {
super(context);
}
public CustomScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public CustomScrollView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev)
{
/* Prevent parent controls from stealing our events once we've gotten a touch down */
if (ev.getActionMasked() == MotionEvent.ACTION_DOWN)
{
ViewParent p = getParent();
if (p != null)
p.requestDisallowInterceptTouchEvent(true);
}
return false;
}
}
CustomScrollViewの使用方法は?
別のScrollviewを子ビューとして追加する画面に、CustomScrollViewを親として追加できます。画面全体がスクロール可能です。これをRelativeLayoutに使用しました。
<?xml version="1.0" encoding="utf-8"?>
<**package.**CustomScrollView
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:id="@+id/some_id"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent"
xmlns:tools="http://schemas.Android.com/tools">
<RelativeLayout
Android:layout_width="match_parent"
Android:layout_height="wrap_content">
#**Inside this I had a TableLayout and TableRow. Inside the TableRow,**
#**I had a TextView which I made scrollable from Java Code.**
#**textView.setMovementMethod(new ScrollingMovementMethod());**
</RelativeLayout>
</ankit.inventory.ankitarora.inventorymanagementsimple.CustomScrollView>
私の場合はうまくいきました。
タッチイベントを使用してスクロールを無効にするNestedScrollViewのレイアウトがありました。
progressBarLayout.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
return true;
}
});
そして有効にする:
progressBarLayout.setOnTouchListener(null);
public class LockableScrollView extends ScrollView {
private boolean mScrollable = true;
public LockableScrollView(Context context) {
super(context);
}
public LockableScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public LockableScrollView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@RequiresApi(api = Build.VERSION_CODES.Lollipop)
public LockableScrollView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
}
public void setScrollable(boolean enabled) {
mScrollable = enabled;
}
public boolean isScrollable() {
return mScrollable;
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
return mScrollable && super.onTouchEvent(ev);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
return mScrollable && super.onInterceptTouchEvent(ev);
}
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
// if we can scroll pass the event to the superclass
if (mScrollable) return super.onInterceptTouchEvent(ev);
// only continue to handle the touch event if scrolling enabled
return mScrollable; // mScrollable is always false at this point
default:
return super.onInterceptTouchEvent(ev);
}
}
@JosephEarl +1彼はここで素晴らしいソリューションを提供しており、プログラムでそれを行うためのいくつかの小さな変更を加えて私にとって完璧に働いた。
私が行った小さな変更は次のとおりです。
LockableScrollViewクラス:
public boolean setScrollingEnabled(boolean enabled) {
mScrollable = enabled;
return mScrollable;
}
MainActivity:
LockableScrollView sv;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
sv = new LockableScrollView(this);
sv.setScrollingEnabled(false);
}
ギャラリーを拡張し、必要なときにいくつかのフラグを使用してスクロールを無効にすることができます。
public class MyGallery extends Gallery {
public boolean canScroll;
public MyGallery(Context context, AttributeSet attrs) {
canScroll = true;
super(context, attrs);
}
public void setCanScroll(boolean flag)
{
canScroll = flag;
}
@Override
public boolean onScroll(Android.view.MotionEvent e1, Android.view.MotionEvent e2, float distanceX, float distanceY) {
if (canScroll)
return super.onScroll(e1,e2,distancex,distancey);
else
return false;
}
@Override
public boolean onSingleTapUp(MotionEvent e)
{
if (canScroll)
return super.onSingleTapUp(ey);
else
return false;
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY)
{
if (canScroll)
return super.onFling(e1,e2,velocityX,velocityY);
else
return false;
}
}
これは役立ちますか?
((ScrollView)findViewById(R.id.QuranGalleryScrollView)).setOnTouchListener(null);