2011-06-07 2 views
3

Я работаю над частью своего приложения, и мне было интересно, можно ли открыть Скользящий ящик частично, а не полностью закрываться, чтобы пользователь мог достигнуть максимума в текстовом контенте, прежде чем нажимать кнопку «Показать больше» который сможет отобразить остальную часть текста.SlidingDrawer полуоткрыт при запуске

Заранее спасибо.

ответ

0

Может быть, попробовать что-то вроде установки контента innner из-за slidingdrawer быть что-то вроде

<SlidingDrawer android:layout_height="wrap_content" 
      android:handle="@+id/handle" 
      android:content="@+id/content" 
      android:id="@+id/slide" 
      android:orientation="vertical" 
      android:layout_width="fill_parent"> 
    <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content"...> 
     <Button android:id="@+id/ShowMore"... /> 
     <LinearLayout android:id="@+id/More" android:visibility="gone" ...> 
      ... more stuff 
     </LinearLayout> 

    </LinearLayout> 
</SlidingDrawer> 

затем установите кнопку ShowMore, чтобы переключить видимость LinearLayout «Подробнее» между View.GONE и View.VISIBLE

** EDIT: Хм перечитывая ваш вопрос, я на самом деле немного смущен: название «открыто при запуске», но затем вы говорите «откройте частично». Вы хотите, чтобы он начинался в частично открытом состоянии? или открыть частично, когда пользователь перетащит его? Мое предложение (непроверенное) заключается в том, чтобы скользящий ящик обертывал свой размер до содержимого и сначала начинал контент, показывая только кнопку +, что бы вы хотели показать за пределами внутреннего линейного макета «Больше», а затем показать, что когда они нажмите кнопку.

+0

То, что я пытаюсь достичь, имеет частичный текст, отображаемый во все времена, пока пользователь не нажимает кнопку, показывая, что текст не расширяется, и содержимое полностью отображается. Это достаточно ясно? –

+0

, так что, возможно, проще: a) иметь текстовое изображение и кнопку. изначально дают textview сокращенный текст, пока они не нажмут на кнопку больше, а затем дадут полный текст или b) имеют сокращенный текст, кнопку и скрытый текст с полным текстом, и когда они нажимают кнопку, отображается скрытый текстовый вид? – jkhouw1

+0

Я пробовал это потенциальное решение, но, похоже, оно не работает. –

0

Я недавно разработал приложение, в котором у меня было требование, соответствующее требованиям. По googling Я обнаружил, что мы изменили исходный код оригинального скользящего ящика, я сделал это, и , и весь измененный код со мной, я протестировал и отлично работал. Я могу отправить вам весь файл. Просто сообщите мне свой идентификатор электронной почты.
Вам также потребуется attrs.xml в папке значений вашего проекта, где вы хотите использовать этот код. Код attrs.xml размещен ниже.

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <declare-styleable name="SlidingDrawer"> 
     <attr name="handle" format="integer"/> 
     <attr name="content" format="integer"/> 
    </declare-styleable> 
</resources> 

Я надеюсь, что это вам поможет.

+0

не могли бы вы опубликовать свой код на pastbin и предоставить нам URL-адрес? Мне нужно, чтобы SlidingDrawer был частично открыт в начале действия. Мне удалось заставить его работать с помощью андроида: bottomOffset = "- 50dip", проблема заключается в том, что SlidingDrawer сохраняет видимость содержимого в GONE, пока дескриптор не будет нажат или не будет полностью открыт. Спасибо, Thiago – Thiago

+0

Привет, есть ли шанс увидеть ваш код? Это функция пользовательского интерфейса, которую я хотел интегрировать в свое приложение, но я не мог заставить ее работать совершенно правильно и пошел на просмотр списка, нажав кнопку, чтобы оживить ее на весь экран. Хорошо работает, но было бы неплохо теперь, как это работает. –

+0

Привет @Android_Crazy, не могли бы вы опубликовать свой код и отправить нам URL? Я также испытываю ту же проблему. Спасибо – Thiago

8

У меня была аналогичная проблема, и я закончил модификацию SlidingDrawer, чтобы иметь возможность отображать часть содержимого, когда ящик свернут/закрыт. С SemiClosedSlidingDrawer вы указываете, сколько экрана контента, который должен быть показан в разрушилась/закрытом режиме с атрибутом измерения «semiClosedContentSize»:

<se.smartrefill.view.SemiClosedSlidingDrawer 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:custom="http://schemas.android.com/apk/res/se.smartrefill.app.x" 
    android:id="@+id/mySlidingDrawer" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    custom:orientation="horizontal" 
    custom:handle="@+id/handle" 
    custom:content="@+id/content" 
    custom:allowSingleTap="true" 
    custom:semiClosedContentSize="40dp" 
    > 

Тогда ваш attrs.xml (в разрешении/значения /) также должен содержать :

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

, где 'se.smartrefill.app.x' относится к пакету приложений, определенной в AndroidManifest.

Этот конкретный SlidingDrawer (сверху) настроен на использование горизонтальной ориентации, а в режиме с разворачиванием/закрытием будет отображаться полоса ширины шириной 40dp (и fill_parent high). В расширенном/открытом режиме эта реализация будет работать так же, как и стандартный SlidingDrawer, но в режиме с ручным/закрытым доступом экран содержимого никогда не станет полностью скрытым (если вы не укажете semiClosedContentSize = "0dp", который превратит его в стандартный SlidingDrawer). Эта реализация основана на реализации SlidingDrawer в Android-4 («1,6»), но совместима с (вкл.) Android-14 («4.0»). Эта реализация также должна быть совместима с будущими версиями Android (почти ничего не изменилось в SlidingDrawer между API 4 и API 14). Эта реализация поддерживает вертикальную и горизонтальную ориентацию.

Попробуйте!

С уважением, Jacob

+1

Большое спасибо за эту реализацию, это сработало для меня! НО (и я знаю, что я опаздываю на год, но, надеюсь, это может помочь другим людям, читающим это): В строке 519 есть два знака минус (-), их должен быть один. В противном случае при использовании полузакрытого содержимого прикосновение к расширению не будет работать. – RemiX

+0

Я разработчик iOS и новичок в Android, не могли бы вы предоставить образец проекта? это здорово, если вы можете изменить это http://www.androidhive.info/2013/11/android-sliding-menu-using-navigation-drawer/ –

1

я наткнулся на аналогичной проблемой, как вы. В начале мне нужен только (довольно узкий) список в моем скользящем ящике, так что пользователь может просто получить пик в контенте. Ящик должен полностью открываться только тогда, когда выбран элемент в списке, и некоторое содержимое для этого элемента отображается в представлении изображения рядом со списком.

Поэтому расположение моего выдвижного ящика такова:

<RelativeLayout 
    android:id="@+id/drawerContainer" 
    android:layout_alignParentRight="true" 
    android:layout_width="120dp" 
    android:layout_height="match_parent"> 
    <SlidingDrawer 
    android:id="@+id/drawer" 
    android:layout_width="wrap_content" 
    android:layout_height="match_parent" 
    android:orientation="horizontal" 
    android:handle="@+id/handle" 
    android:content="@+id/content"> 
    <ImageView 
     android:id="@+id/handle" 
     android:layout_width="20dip" 
     android:layout_height="match_parent" 
     android:src="@drawable/drawer_handle /> 
    <LinearLayout 
     android:id="@+id/content" 
     android:layout_width="wrap_content" 
     android:layout_height="match_parent" 
     android:orientation="horizontal"> 
     <ListView 
     android:id="@+id/list" 
     android:layout_width="100dp" 
     android:layout_height="match_parent"> 
     </ListView> 
     <ImageView 
     android:id="@+id/image" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:visibility="gone"> 
     </ImageView> 
    </LinearLayout> 
    </SlidingDrawer> 
</RelativeLayout> 

Так на старте вид изображение исчезло. В OnItemClickListener для моего списка зрения я контролировать параметры макета ящика:

private OnItemClickListener onItemClickListener = new OnItemClickListener() { 

    @Override 
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {  

    if (imageView.getVisibility() == View.GONE) {  
     ExpandViewAnimation animation = new ExpandViewAnimation(drawerContainer, ((View) drawerContainer.getParent()).getWidth()); 
     animation.setDuration(500); 
     drawerContainer.setAnimation(animation); 
     animation.start(); 
     imageView.setVisibility(View.VISIBLE); 
    } 
    //code for displaying an image in the imageview 
    } 
}; 

Как вы можете видеть, я использую свою пользовательскую анимацию для контейнера ящика так, что сохраняется nicity скольжения ящика открытия. Вот класс анимации:

public class ExpandViewAnimation extends Animation { 
    int targetWidth; 
    int initialWidth; 
    View view; 

    public ExpandViewAnimation(View view, int targetWidth) { 
    this.view = view; 
    this.targetWidth = targetWidth; 
    initialWidth = view.getWidth(); 
    } 

    @Override 
    protected void applyTransformation(float interpolatedTime, Transformation t) { 

    int newWidth = initialWidth + (int) ((targetWidth - initialWidth) * interpolatedTime); 

    LayoutParams lp = new LayoutParams((LayoutParams) view.getLayoutParams()); 
    lp.addRule(RelativeLayout.ALIGN_PARENT_RIGHT); 
    view.setLayoutParams(lp); 

    view.getLayoutParams().width = newWidth; 
    view.requestLayout(); 

    if (newWidth == targetWidth) { 
     LayoutParams matchParentParams = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); 
     view.setLayoutParams(matchParentParams); 
     view.clearAnimation(); 
    } 
    } 

    @Override 
    public void initialize(int width, int height, int parentWidth, int parentHeight) { 
    super.initialize(width, height, parentWidth, parentHeight); 
    } 

    @Override 
    public boolean willChangeBounds() { 
    return true; 
    } 
} 

Причина, почему я устанавливаю новые параметры макета, потому что в самом начале я экономлю начальный набор параметров (как в файле макета) и применить его обратно в onDrawerClose:

private OnDrawerCloseListener onDrawerCloseListener = new OnDrawerCloseListener() { 

    @Override 
    public void onDrawerClosed() { 
    imageView.setVisibility(View.GONE); 
    imageView.setImageDrawable(null); 
    drawerContainer.setLayoutParams(initialLayoutParams); 
    } 
}; 

Если вы хотите, чтобы пользователь мог полностью открыть ящик при перемещении салфетки на ручке, вы можете применить аналогичную анимацию в onTouchListener.

Последнее замечание: мой скользящий выдвижной ящик находится в макете, потому что он включен в этот макет, так что ящик доступен в нескольких местах. В общем, вам не нужен этот макет вокруг вашего ящика.