Я ищу лучший способ создания Accordion-style widget such as on this page. Есть ли способ добиться такого же эффекта с помощью стандартного инструментария Android или мне нужно создать собственный виджет? Если да, то какой из них вы бы рекомендовали продлить, если таковые имеются?Android - аккордеонный виджет
ответ
Я толкаемом android accordion view проект на GitHub. Мы используем его для наших клиентов, проверенных на 2.2, 2.3.x, 3.2 и 4.0.3. Работает очень хорошо для нас.
Идет добавление анимации на складке/разворачивании в следующем шаге.
Вот небольшой скриншот:
Hi Maciej, я успешно запускаю ваш аккордеон приложение, и это выглядит очень хорошо. Я хотел вставить в свое приложение, как я могу это сделать? Я пытался копировать файлы, но у меня проблемы с ic_resource не найдены. Правильно ли я делаю это? следует ли копировать все файлы? –
@NicholasTJ Я думаю, вы должны спросить об этом на github ... но так как вы спросили здесь: проект - проект библиотеки Android, подробнее об этом читайте здесь http://developer.android.com/tools/projects/index.html# LibraryProjects. Вы можете построить с maven и получить apklib - см. Здесь https://code.google.com/p/maven-android-plugin/wiki/ApkLib –
Спасибо за подсказку, я ценю это, я прочитаю о ссылках, которые вы предоставлена. –
И в случае, если вы все еще задаетесь вопросом - это может быть сделано в значительной степени с помощью пары кнопок/макетов, уложенных внутри линейного макета. Псевдо-код следует
<LinearLayout android:orientation="vertical">
<Button android:text="Panel 1"/>
<SomeKindOfLayout android:id="@+id/panel1">
<!-- widgets in first panel go here -->
</SomeKindOfLayout>
<Button android:text="Panel 2"/>
<SomeKindOfLayout android:id="@+id/panel2" android:visibility="gone">
<!-- widgets in second panel go here -->
</SomeKindOfLayout>
<Button android:text="Panel 3"/>
<SomeKindOfLayout android:id="@+id/panel3" android:visibility="gone">
<!-- widgets in third panel go here -->
</SomeKindOfLayout>
<Button android:text="Panel 4"/>
<SomeKindOfLayout android:id="@+id/panel4" android:visibility="gone">
<!-- widgets in fourth panel go here -->
</SomeKindOfLayout></LinearLayout>
Другое дело, возможно, попробовать складывает ExpandableListView-е поверх друг друга
Эй, этот код выглядит знакомым ... ;-) – CommonsWare
Мне пришлось разделить его со всем миром :) Для записи - это фрагмент, предоставленный мне @commonsguy на maillist (android.developers) – Bostone
Hellow I am dynamiaclly создает кнопки для аккордеона, так как не уверен в количестве кнопок в списке. для каждой кнопки у меня есть LinearLayout с некоторыми представлениями внутри нее. Может кто-нибудь дать мне знать, как получить onclicklistner соответствующей кнопки аккордеона, так что я могу переключаться между visiblity и Gone для соответствующих LinearLayouts. –
Я должен сам рисковать и сказать, что @Bostone ответ является наиболее подходящим. Я дам вам свой код ниже, чтобы вы могли видеть. Спасибо за GitHub Maciej Łopaciński, но, как сказал @SudoPlz в комментариях, документации вообще нет. Я не знал, с чего начать. Я пытаюсь сделать это с помощью Eclipse и Android Studio, и ни я не мог запустить проект, чтобы начать выяснять, как его работа. Кроме того, последний бой в этом проекте был около 1 года назад, что заставляет меня бояться многого, что если что-то пойдет не так, я застрянет в тупике. Итак, без дальнейших проволочек, вот мое решение, основанное на @Bostone:
1.- Сначала вы должны создать кнопку и макет вложенной в ScrollView:
<ScrollView 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=".TasksListActivity">
<Button
android:id="@+id/magic_btn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Magic Btn"/>
<LinearLayout
android:id="@+id/magic_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:visibility="gone">
</LinearLayout>
</ScrollView>
2.- После этого перейдите на ваш соответствующий JAVA, найдите кнопку и установите onClickListener, внутри onClickListener вы найдете макет.
Button findMagicBtn = (Button) findViewById(R.id.magic_btn);
findMagicBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
});
3.- Так что теперь внутри onClickListener мы найдем макет. Как вы можете видеть на первом шаге, макет устанавливается по умолчанию на GONE
, но теперь мы должны установить его на видимое. Проблема в том, как я могу сделать это снова и наоборот? Итак, мы добавим условие для получения видимости макета и на основе этого он будет скрыт или показать:
Button findMagicBtn = (Button) findViewById(R.id.magic_btn);
findMagicBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
LinearLayout findMagicLl = (LinearLayout) findViewById(R.id.magic_layout);
if (findMagicLl.getVisibility() == View.VISIBLE) {
findMagicLl.setVisibility(View.GONE);
} else {
findMagicLl.setVisibility(View.VISIBLE);
}
}
});
Это можно поставить друг на друга столько раз, сколько вы хотите.
Итак, если вы действительно хотите, чтобы это выглядело как аккордеон, вы можете сутулиться. Вы можете положить стрелку справа от него, используя пример:
findMagicBtn.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.right_arrow, 0);
Вы должны сделать это внутри onClickListener и использовать условие, чтобы изменить направление стрелки, изменяя вытяжке (если ушел, и стрелка вниз, а если отображается стрелка вверх).
Кроме того, вы можете сделать его более естественным путем добавления анимации, как это:
ScaleAnimation animation = new ScaleAnimation(1f, 1f, 1f, 0f, Animation.RELATIVE_TO_SELF, 0f, Animation.RELATIVE_TO_SELF, 0f);
animation.setDuration(180);
animation.setFillAfter(true);
findMagicLl.startAnimation(animation);
Вы должны учитывать, что выше анимация должна быть сделана в то время как вид виден. Имейте в виду, что setFillAfter(true)
, изменит размер контейнера постоянно, поэтому, если вы это сделаете, возможно, вы больше не хотите использовать VIEW.GONE
. Этот вопрос имеет замечательное объяснение по поводу Scale Animation
Я использовал ваш способ имитации аккордеона, однако внутренний LinearLayout не расширяется в соответствии с его дочерним элементом управления. Внутри этого макета я размещаю ListView с некоторыми элементами. Эффект, когда я запускаю его, заключается в том, что показан только первый элемент, но я могу прокручивать список, чтобы видеть другие элементы по одному. Все аккордеон создается программно. Не могли бы вы дать мне подсказку о том, как решить эту проблему, и показать весь список без свитка? – jstuardo
@jstuardo Im извините, но я думаю, что ваша проблема связана с списками, listviews всегда загружают достаточно элементов, чтобы они соответствовали доступному размеру на экране. Итак, что, если нет размера ... ... в listviews следующий элемент вне видимого объекта создается только в том случае, если пользователю нужно его видеть, это потому, что он сохраняет память. Мне будет грустно, если у моего исправления есть эта проблема, но я думаю, вы можете исправить это, изменив свойства linearlayout heigh. Попробуйте сопоставить родительский. Также посмотрите, что произойдет, не используя видимость, ушедшую по умолчанию. ... возможно, вы можете переопределить поведение listview. Дай мне знать. – cutiko
@jstuardo У вас возникла аналогичная проблема: вы можете прочитать следующее: http://stackoverflow.com/questions/18411494/android-listview-show-only-one-item http://stackoverflow.com/a/ 32881309/4017501 http://stackoverflow.com/a/31818632/4017501 – cutiko
У меня есть хорошее решение, используя вид типа hidden и Visible. Вот он .. http://android-puremvc-ormlite.blogspot.com/2011/07/android-simple-accordion-panel.html – Surojit
Почему это не родной виджет? – mitsest