Альтернативный способ реализации скользящего катка, который теперь устарел с апреля 17

В моем приложении у меня есть скользящий ящик с кнопками изображения в них, и при нажатии на него отображается описание и информация об изображении. Поэтому в основном я использую только один файл XML и один файл Java для этого. (Но я заметил, что добавление большего количества кнопок изображения и магов для отображения занимает некоторое время, чтобы загрузить). И теперь, когда API 17 обесценивает скользящий ящик, меня немного беспокоит будущая загрузка приложения. Теперь мой вопрос в том, есть ли альтернативный способ достижения этого без использования скользящего выдвижного ящика или счетчика. Я не хочу создавать xml и java файлы для каждого изображения (в итоге я получаю 100 + xml и java) Вот мой код, который у меня есть на данный момент.

XML:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">

<ScrollView 
   android:layout_width="wrap_content"
   android:layout_height="wrap_content">
   <RelativeLayout 
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"> 

<ImageView 
    android:id="@+id/iM1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:scaleType="fitStart"
    android:adjustViewBounds="true"/>

</RelativeLayout>
</ScrollView>

<SlidingDrawer
    android:id="@+id/sD1"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_alignParentTop="true"
    android:layout_centerHorizontal="true"
    android:content="@+id/content"
    android:handle="@+id/handle">

    <Button
        android:id="@+id/handle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@drawable/icon_1" />

    <RelativeLayout
        android:id="@+id/content"
        android:layout_width="match_parent"
        android:layout_height="match_parent" 
        android:background="@drawable/icon_background1">

        <ScrollView
            android:layout_width="match_parent"
            android:layout_height="match_parent" >

            <RelativeLayout
                android:layout_width="fill_parent"
                android:layout_height="fill_parent" >

                <Button
                    android:id="@+id/asample"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:background="@drawable/imageicon1"/>
                   .....

И Java:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE); 
    this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN); 
    setContentView(R.layout.campsites);
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    final SlidingDrawer slider = (SlidingDrawer) findViewById(R.id.sD1);
    final ImageView imageView = (ImageView) findViewById(R.id.iM1);
    slider.animateOpen();

    Button next = (Button) findViewById(R.id.asample);
    Button next1 = (Button) findViewById(R.id.bsample);
    ..........

    next.setOnClickListener(new View.OnClickListener() {

        public void onClick(View view) {
            imageView.setImageDrawable(getResources().getDrawable(R.drawable.asample));
            slider.animateClose();
        } 
    });
    next1.setOnClickListener(new View.OnClickListener() {

        public void onClick(View view) {
            imageView.setImageDrawable(getResources().getDrawable(R.drawable.bsample));
            slider.animateClose();
        } 
    });
    ............

Может ли кто-нибудь помочь или предложить предложение о том, что делать?

Ответ 1

Это SlidingDrawer слева, правильно? Если это так, вы можете посмотреть DrawerLayout.

Это часть библиотеки поддержки Android, и вы должны быть в состоянии вместо этого заменить свой XML, а не просто совместимы с API4

На этой странице есть пример.

<android.support.v4.widget.DrawerLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <!-- The main content view -->
    <FrameLayout
        android:id="@+id/content_frame"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
    <!-- The navigation drawer -->
    <ListView android:id="@+id/left_drawer"
        android:layout_width="240dp"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:choiceMode="singleChoice"
        android:divider="@android:color/transparent"
        android:dividerHeight="0dp"
        android:background="#111"/>
</android.support.v4.widget.DrawerLayout>

Некоторые заметки с этой страницы

Этот макет демонстрирует некоторые важные характеристики макета:

  • Основной вид содержимого (вышеописанный FrameLayout) должен быть первым дочерним элементом DrawerLayout, поскольку порядок XML подразумевает z-порядок и ящик должен быть поверх содержимого. Отображается основной контент. для соответствия ширине и высоте родительского представления, поскольку он представляет собой весь пользовательский интерфейс, когда ящик навигации скрыт.
  • Вид ящика (ListView) должен указывать его горизонтальную плотность с атрибутом android: layout_gravity. Для поддержки права налево (RTL), укажите значение с "start" вместо "left" (так ящик появляется справа, когда макет RTL).
  • Вид ящика указывает его ширину в единицах dp, а высота соответствует родительскому виду. Ширина ящика не должна превышать 320 дп поэтому пользователь всегда может видеть часть основного содержимого.

В основном разница заключается в том, что DrawerLayout является верхним уровнем, и вы помещаете в него свой XML. Так что-то вроде этого (полностью непроверено):

<android.support.v4.widget.DrawerLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <!-- your content surrounded by a layout to signify that it actually content -->
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <ScrollView 
           android:layout_width="wrap_content"
           android:layout_height="wrap_content">
           <RelativeLayout 
               android:layout_width="wrap_content"
               android:layout_height="wrap_content"> 

                <ImageView 
                    android:id="@+id/iM1"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:scaleType="fitStart"
                    android:adjustViewBounds="true"/>

            </RelativeLayout>
        </ScrollView>
    </RelativeLayout>
    <!-- your sliding menu in its own layout -->
    <LinearLayout 
        android:layout_gravity="start"
        android:layout_width="240dp"
        android:layout_height="wrap_content"> 
        <Button
            android:id="@+id/handle"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="@drawable/icon_1" />

        <RelativeLayout
            android:id="@+id/content"
            android:layout_width="match_parent"
            android:layout_height="match_parent" 
            android:background="@drawable/icon_background1">

            <ScrollView
                android:layout_width="match_parent"
                android:layout_height="match_parent" >

                <RelativeLayout
                    android:layout_width="fill_parent"
                    android:layout_height="fill_parent" >

                    <Button
                        android:id="@+id/asample"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:background="@drawable/imageicon1"/>
                       .....
    </LinearLayout>
</android.support.v4.widget.DrawerLayout>

Ответ 2

Я предпочел бы предложить простое скользящее меню, которое я создал сам.

концепция, которую я использовал

Кнопка слайдера и панель содержимого

первоначально кнопка слайдера находится слева (в моем примере), когда вы нажимаете на нее, она сдвигается, и панель содержимого становится видимой.

как я это понял

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

вот мой код.

public class MainActivity extends Activity  {
    boolean toggle_open=false;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);




    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }

    public void open(View v){
        switch (v.getId()) {
        case R.id.imageButton1:
            if(!toggle_open){
            RelativeLayout header=(RelativeLayout)findViewById(R.id.header);
            Display size=getWindow().getWindowManager().getDefaultDisplay();
            int widthby2=size.getWidth()/3;
            RelativeLayout.LayoutParams lp=new RelativeLayout.LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.WRAP_CONTENT);
            lp.setMargins(size.getWidth()/2, 0, 0, 0);
            header.setLayoutParams(lp);

            RelativeLayout slider=(RelativeLayout)findViewById(R.id.panel);
            slider.setLayoutParams(new RelativeLayout.LayoutParams((size.getWidth()/2),size.getHeight()));
            slider.setVisibility(View.VISIBLE);

            toggle_open=true;
            }
            else{
                RelativeLayout header=(RelativeLayout)findViewById(R.id.header);
                RelativeLayout.LayoutParams lp=new RelativeLayout.LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.WRAP_CONTENT);
                lp.setMargins(0, 0, 0, 0);
                header.setLayoutParams(lp);

                RelativeLayout slider=(RelativeLayout)findViewById(R.id.panel);
                slider.setVisibility(View.GONE);
                toggle_open=false;

            }
            break;

        default:
            break;
        }
    }



}

//xml code

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" >

    <RelativeLayout
        android:id="@+id/header"
        android:background="@android:color/black"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:padding="20dp" >

        <ImageButton
            android:id="@+id/imageButton1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:layout_alignParentTop="true"
            android:background="@android:color/black"
            android:onClick="open"
            android:src="@android:drawable/ic_dialog_dialer" />

        <TextView
            android:id="@+id/textView1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignBottom="@+id/imageButton1"
            android:layout_toRightOf="@+id/imageButton1"
            android:text="Admin Panel"
            android:textAppearance="?android:attr/textAppearanceLarge"
            android:textColor="@android:color/white" />

    </RelativeLayout>

    <RelativeLayout
        android:id="@+id/panel"
        android:visibility="gone"
        android:layout_toLeftOf="@+id/header"
        android:layout_width="wrap_content"
        android:layout_height="fill_parent"
        android:background="@android:color/darker_gray"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true" >

        <fragment class="com.example.avanse.FragmentLayout$TitlesFragment"
            android:id="@+id/titles"
            android:layout_width="match_parent" android:layout_height="match_parent"/>

    </RelativeLayout>

</RelativeLayout>

Ответ 3

SlidingUpPanel от ребят приложения Umano кажется лучшим способом прямо сейчас. Вы можете найти его в: https://github.com/umano/AndroidSlidingUpPanel

Я нашел информацию об этом в этом другом сообщении SOF: вертикальный DrawerLayout или SlidingPaneLayout : D

Изменить: этот тоже выглядит очень многообещающим: https://github.com/6wunderkinder/android-sliding-layer-lib (в видео youtube, похоже, работает только справа налево и слева направо, но если вы загрузите фактическое демонстрационное приложение, вы увидите, что также можно перейти снизу вверх и сверху вниз)

Ответ 4

Я думаю Это - хорошая альтернатива
AFAIK не использует SlidingDrawer, и вы можете изменить направление ящика

Ответ 5

простой андроид вы можете использовать DrawerLayout. но я рекомендую SlidingMenu lib, что улучшает удобство использования для пользователя и программиста.