2012-07-24 6 views
7

Ich möchte SlidingDrawer in meiner Anwendung verwenden. Aber ich muss die handle verbergen und 20% des Inhalts anzeigen, um sichtbar zu sein, wenn SlidingDrawer geschlossen ist. Auch ich möchte alle schieben (berühren oder ziehen) Aktionen der handle zu content. Bitte helfen Sie mir, wenn jemand eine Lösung dafür hat.SlidingDrawer ohne Griff und Schiebeaktionen zum Inhalt

Bitte beachten Sie das folgende Code-Snippet, das ich ausprobiert habe.

<View 
    android:id="@id/handle" 
    android:layout_width="0dip" 
    android:layout_height="fill_parent" /> 

<LinearLayout 
    android:id="@id/content" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" > 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="@string/sliding_drawer" /> 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="@string/sliding_drawer" /> 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="@string/sliding_drawer" /> 
</LinearLayout> 

und hier meine Tätigkeit:

 import android.app.Activity; 
    import android.graphics.Color; 
    import android.os.Bundle; 
    import android.view.View; 
    import android.widget.SlidingDrawer; 
    import android.widget.SlidingDrawer.OnDrawerCloseListener; 
    import android.widget.SlidingDrawer.OnDrawerOpenListener; 

    public class SlidingDrawerActivity extends Activity { 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     final SlidingDrawer drawer = (SlidingDrawer) findViewById(R.id.drawer); 
     drawer.setOnDrawerCloseListener(new OnDrawerCloseListener() { 

      public void onDrawerClosed() { 
       // TODO Auto-generated method stub 
       drawer.setBackgroundColor(Color.BLACK); 
      } 
     }); 

     drawer.setOnDrawerOpenListener(new OnDrawerOpenListener() { 

      public void onDrawerOpened() { 
       // TODO Auto-generated method stub 
       drawer.setBackgroundColor(Color.BLUE); 
      } 
     }); 

     View content = drawer.getContent(); 
     content.setClickable(true); 
     content.setTouchDelegate(drawer.getHandle().getTouchDelegate()); 
    } 
} 

Hier bin ich der Lage, die handle indem width=0dip zu verstecken, aber nicht in der Lage zu wissen, wie 20 zu zeigen, % des Inhalts, wenn SlidingDrawer geschlossen ist und die Aktionen auf festlegen die Content der SlidingDrawer.

Ich versuchte, die touchDelegate des Griffs und setzen es auf Content, aber es funktioniert nicht. Bitte helfen Sie mir, dieses Problem zu lösen.

+0

Hallo Raj, cooles Konzept! :). Können Sie bitte etwas Code posten, was Sie geschrieben haben oder zu welchem ​​Zeitpunkt Sie es nicht geschafft haben? Jeder ist hier mehr als glücklich, Ihnen zu helfen. – Abhilasha

+1

Hallo Abhilasha, ich habe meinen Beitrag aktualisiert. Bitte überprüfen Sie das und helfen Sie mir, wenn Sie eine Lösung haben. – Raj

+0

+1 für Ihre Mühe :) – Abhilasha

Antwort

0

Ich glaube nicht, dass dies mit dem aktuellen SlidingDrawer möglich ist, es sei denn, Sie haben mit etwas zu tun, das in diese 20% geschnitten und getrennt werden kann. Wenn Sie sich die Quelle für SlidingDrawer anschauen, speziell open(), sehen Sie, dass sie eine private Methode, openDrawer(), aufruft. Hier ist, was das bedeutet:

private void openDrawer() { 
    moveHandle(EXPANDED_FULL_OPEN); 
    mContent.setVisibility(View.VISIBLE); 

    if (mExpanded) { 
     return; 
    } 

    mExpanded = true; 

    if (mOnDrawerOpenListener != null) { 
     mOnDrawerOpenListener.onDrawerOpened(); 
    } 
} 

Wie Sie den Inhalt sehen kann (die „Schublade“) ist nicht sichtbar, bis der Griff zu bewegen beginnt. Es scheint keinen Haken zu geben, wenn sich die Schublade bewegt, nur wenn sie anfängt oder endet, so dass Sie nicht in der Lage wären, dynamisch zu aktualisieren, was sich im Griff oder in der Schublade befand.

Wenn Sie mit einem Bild arbeiten, könnten Sie es in zwei Teile schneiden, 20% und 80%. Aber da Sie mit 3 TextViews arbeiten, sieht das nicht so aus.

Gegeben, dass ich denke, eine Option würde die Quelle von SlidingDrawer nehmen und Ihre eigene Klasse erstellen. Auf diese Weise haben Sie die volle Kontrolle darüber, wie das Zeichnen gehandhabt wird, können aber alle Listener wiederverwenden. Hier ist ein Link zur Quelle:

0

Ich werde etwas tun, wie Sie tun.

Da Slidedrawer jetzt veraltet ist, habe ich benutzerdefinierte Slidedraw namens MultiDirectionSlidingDrawer verwendet. Hier ist der Code, den ich im Internet finde: MultiDirectionSlidingDrawer Source Code

Um Inhaltsansicht als ein Handle zu zeigen, werde ich nicht Handle aber den Inhalt zu verbergen. I Inhalt Ansicht der Höhe eingestellt 0 dip ist

<it.sephiroth.demo.slider.widget.MultiDirectionSlidingDrawer 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:id="@+id/drawer" 
    custom:handle="@+id/handle" 
    custom:content="@+id/content" 
    custom:direction="topToBottom" 
    custom:animateOnClick="false" 
    custom:allowSingleTap="false" 

    > 
    <LinearLayout 
     android:id="@id/handle" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:orientation="vertical" 
     android:gravity="center" 
     > 
     <!-- 
     paste your content here 
     --> 
    </LinearLayout> 
    <LinearLayout 
     android:id="@id/content" 
     android:layout_width="fill_parent" 
     android:layout_height="0dp" 
     android:orientation="vertical" 
     android:gravity="center" 
     > 

    </LinearLayout> 
</it.sephiroth.demo.slider.widget.MultiDirectionSlidingDrawer> 

Da meine Schublade Start von oben, berechne ich oben in Offset onMeasure

@Override 
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) 
{ 
    int widthSpecMode = MeasureSpec.getMode(widthMeasureSpec); 
    int widthSpecSize = MeasureSpec.getSize(widthMeasureSpec); 

    int heightSpecMode = MeasureSpec.getMode(heightMeasureSpec); 
    int heightSpecSize = MeasureSpec.getSize(heightMeasureSpec); 

     if (widthSpecMode == MeasureSpec.UNSPECIFIED || heightSpecMode == MeasureSpec.UNSPECIFIED) { throw new RuntimeException(
      "SlidingDrawer cannot have UNSPECIFIED dimensions"); } 

     final View handle = mHandle; 
     measureChild(handle, widthMeasureSpec, heightMeasureSpec); 

     //Custom top offset 
     int intHandleHeight = handle.getHeight(); 
     mTopOffset = intHandleHeight*80*-1/100; 

     if (mVertical) { 
      int height = heightSpecSize - handle.getMeasuredHeight() - mTopOffset; 
      mContent.measure(MeasureSpec.makeMeasureSpec(widthSpecSize, MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY)); 
     } else { 
      int width = widthSpecSize - handle.getMeasuredWidth() - mTopOffset; 
      mContent.measure(MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(heightSpecSize, MeasureSpec.EXACTLY)); 
     } 

     setMeasuredDimension(widthSpecSize, heightSpecSize); 
    } 
0

Ich versuche, etwas sehr ähnlich zu tun. Hattest du Glück?

Zum Anzeigen von 20% des Inhalts, wenn SlidingDrawer geschlossen ist, empfehle ich SemiClosedSlidingDrawer. Ich glaube, das ist, wo ich es ursprünglich gefunden habe: http://pastebin.com/FtVyrcEb.

Auch ich habe dies in res/Wert in meiner attr.xml Datei hinzugefügt/

<!-- SemiClosedSlidingDrawer --> 
<declare-styleable name="SemiClosedSlidingDrawer"> 
    <attr name="handle" format="integer" /> 
    <attr name="content" format="integer" /> 
    <attr name="topOffset" format="dimension" /> 
    <attr name="bottomOffset" format="dimension" /> 
    <attr name="allowSingleTap" format="boolean" /> 
    <attr name="animateOnClick" format="boolean" /> 
    <attr name="semiClosedOrientation" format="string" /> 
    <attr name="semiClosedContentSize" format="dimension" /> 
</declare-styleable> 
1

eine slidingDrawer ohne Griff haben, ist der Trick, nur die Breite und Höhe des Griffs 0DP gesetzt. Prost