2011-01-17 17 views
4

Okeyので、私は構築しているアンドロイドアプリケーションのスライディングドロワーにボタンを実装しました。唯一の問題は、私がボタンを押すとスライド式の引き出し全体が押され、スライドするということです。スライド式引き出しのボタンはありますか? - Android

XMLで「押し上げる」を無効にすることはできますが、スライドしている引き出しがまだスライドがなくても押されているようには見えません。

私はslidingDrawer.lock()を呼び出します。ボタンが実際には機能しますが、スライド式の引き出しはスライドしたり、押し上げたりすることはできません。

この問題を解決する簡単な方法はありますか?

答えて

6

SlidingDrawerハンドルにボタンを追加し、ハンドルを押した/ドラッグしたときにユーザーが標準のSlidingDrawerビヘイビアを維持したままボタンを操作するようにしたいと思っていますか?

私はちょうど同様の問題を解決しました。そのような

私のハンドルを探していた何かが:

Capture of the layout

これは、2つのボタンと(標準SlidingDrawerハンドルとして反応)本当のハンドルになります中央のTextViewで構成されます。

public boolean onInterceptTouchEvent(MotionEvent event) { 
    //... 
    final Rect frame = mFrame; 
    final View handle = mHandle; 

    // original behaviour 
    //mHandle.getDrawingRect(frame); 

    // New code 
    View trackHandle = mTrackHandle; 
    // set the rect frame to the mTrackHandle view borders instead of the hole handle view 

    // getParent() => The right and left are valid, but we need to get the parent top and bottom to have absolute values (in screen) 
    frame.set(trackHandle.getLeft(), ((ViewGroup) trackHandle.getParent()).getTop(), trackHandle.getRight(), ((ViewGroup) trackHandle.getParent()).getBottom()); 



    if (!mTracking && !frame.contains((int) x, (int) y)) { 
     return false; 
    } 
    //... 
} 

は、私は、標準SlidingDrawer.javaクラスのonInterceptTouchEvent方法でソースコードのビットを変更し、ボタンが(アンドロイドコードソースからソースファイルをコピー&ペースト)独立SlidingDrawerの動作させるために

私はまた、活動の作成時に、使用する本物のhanlde設定するmTrackHandle属性のセッターを追加しました:あなたは二つのボタンの上の標準的なリスナーを設定することができた後

protected void onCreate(Bundle savedInstanceState) { 
    //... 
    mSlidingDrawer.setTrackHandle((View) findViewById(R.id.menu_handle_TextView_Title)); 
    //... 
} 

を。彼らは魅力的に働くでしょう。

+0

を助けることができるかもしれません。 基本クラスを拡張し、必要なメソッドをオーバーライドする可能性はありますか? –

+0

ここでsetTrackHandleは何ですか? –

+0

これは、Android [SlidingDrawer](http://developer.android.com/reference/android/widget/SlidingDrawer.html)に追加してTrackHandleを設定できる方法です。デフォルトではgetHandle()メソッドしかありません。これを追加するには、SlidingDrawerクラスをサブクラス化してメソッドを追加する必要があります。 –

2

Joakim Engstromへの回答: はい、可能です! これを行うには、onInterceptTouchEventを次のようにオーバーライドする必要があります。

 @Override 
public boolean onInterceptTouchEvent(MotionEvent event) { 
    // TODO Auto-generated method stub 
    rect = new Rect(handle.getLeft(), ((View) handle.getParent()).getTop(), 
      handle.getRight(), ((View) handle.getParent()).getBottom()); 
    if (!rect.contains((int) event.getX(), (int) event.getY())) { 
     if (event.getAction() == MotionEvent.ACTION_UP) 
      this.lock(); 
     else 
      this.unlock(); 
     return false; 
    } else { 
     this.unlock(); 
     return super.onInterceptTouchEvent(event); 
    } 
} 

また、アクティビティの作成中にハンドルを実際のハンドルビューに設定するセッターを追加する必要があります。

+0

私は上記のコードを試しましたが、ボタンをスワイプ可能にしません。私は、私のスライド式引き出しには、別のアイテムを持っているrecyclerviewでいっぱいにしています。私はハンドルの全体がスワイプルでクリック可能である必要があります。 Plzは私を助けます。私はさらに[ここ](http://stackoverflow.com/questions/42652190/how-to-implement-swipe-able-button-in-sliding-drawer-handle)の質問をしましたが、答えはありませんでした。 – Ashu

関連する問題