Альтернативный способ реализации скользящего катка, который теперь устарел с апреля 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, что улучшает удобство использования для пользователя и программиста.