我正在寻找创建Accordion-style widget such as on this page的最佳方法。 有没有办法使用标准的Android工具包实现相同的效果,还是我需要构建自定义小部件?如果是的话 - 如果有的话,你会推荐哪一个?
答案 0 :(得分:28)
如果您仍然想知道 - 这可以通过堆叠在线性布局内部的按钮/布局对完成。伪代码如下
<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-s堆叠在彼此之上
答案 1 :(得分:22)
我在github上推了android accordion view项目。我们将它用于我们的客户,在2.2,2.3.x,3.2和4.0.3上进行测试。对我们来说非常有用。
下一步要在fold /展开时添加动画。
这是一个小截图:
答案 2 :(得分:4)
我必须冒险并说@Bostone答案是最合适的。我会在下面给你我的代码,你可以看到。感谢GitHubMaciejŁopaciński,但正如@SudoPlz在评论中所说,根本没有文档。我不知道从哪里开始。我试着用Eclipse和Android Studio来做这件事,我既不能运行项目来开始弄清楚它是如何工作的。此外,该项目的最后一次提交大约是1年前,这让我很害怕,如果出现问题,我将陷入死胡同。所以没有进一步的延迟,这是我在@Bostone的解决方案:
1.-首先,您必须创建一个嵌套在ScrollView中的Button和Layout:
<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中执行此操作并使用条件更改箭头的方向,方法是更改drawable(如果是向下和向下箭头,如果是可见的向上箭头)。
此外,您可以通过添加动画使其看起来更自然,如下所示:
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
答案 3 :(得分:2)
在我的应用程序中,我使用了Riya Gayasen的手风琴视图。入门和运作良好非常容易。这是我所做的。
include ':app',':easyaccordion'
implementation 'com.riyagayasen.android:easyaccordion:1.0.3'