【问题标题】:Android - accordion widgetAndroid - 手风琴小部件
【发布时间】:2009-07-21 22:03:46
【问题描述】:

我正在寻找创建Accordion-style widget such as on this page 的最佳方法。 有没有一种方法可以使用标准的 Android 工具包实现相同的效果,还是我需要构建自定义小部件?如果是这样 - 如果有的话,你会推荐哪一个?

【问题讨论】:

标签: android widget accordion


【解决方案1】:

如果您仍然想知道 - 这几乎可以通过堆叠在线性布局内的一对按钮/布局来完成。伪代码如下

<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 堆叠在一起

【讨论】:

  • 我不得不与全世界分享 :) 作为记录 - 这是@commonsguy 在邮件列表 (android.developers) 上给我的一个 sn-p
  • 您好,我正在为手风琴动态创建按钮,因为它不确定列表中的按钮数量。对于每个按钮,我都有 LinearLayout,里面有一些视图。谁能让我知道如何获取相应手风琴按钮的 onclicklistner,以便我可以在相应 LinearLayouts 的可见性和 Gone 之间切换。
  • 如果您将 ListView 粘贴为 SomeKindOfLayout 是否有效?我似乎记得 Android 只喜欢你每个布局有一个 ListView。
  • 您可以在一个布局中拥有任意数量的 ListView。只是你想在ListActivity(或ListFragment)中使用你的布局,你应该只有一个android:id="@android:id/list"的ListView
【解决方案2】:

我已经在 github 推送了android accordion view 项目。我们将它用于我们的客户,在 2.2、2.3.x、3.2 和 4.0.3 上进行了测试。对我们来说效果很好。

下一步将在折叠/展开时添加动画。

这是小截图:

【讨论】:

  • 您好 Maciej,我成功运行了您的手风琴应用程序,它看起来非常好。我想移植到我的应用程序中,我该怎么做?我尝试复制文件,但我遇到了找不到 ic_resource 的问题。我做对了吗?应该把所有文件都复制出来吗?
  • @NicholasTJ 我认为你应该在 github 上询问它......但既然你在这里问:项目是 android 库项目,请在此处阅读更多信息 developer.android.com/tools/projects/index.html#LibraryProjects。您可以使用 maven 构建并获取 apklib - 请参阅此处code.google.com/p/maven-android-plugin/wiki/ApkLib
  • 感谢您的提示,非常感谢,我会阅读您提供的链接。
  • 但我无法添加我自己的对象(TextView、Buttons 等)初始化。我该怎么做?
  • 不能让它工作......根本没有文档......我的问题与上面的评论相同,我们如何在其中添加自己的对象?我们是否将布局用作容器并在其中添加所有内容?
【解决方案3】:

我不得不冒险说@Bostone 的答案是最合适的。我将在下面给您我的代码,以便您查看。感谢 GitHub Maciej Łopaciński,但正如 @SudoPlz 在 cmets 中所说,根本没有文档。我不知道从哪里开始。我尝试使用 Eclipse 和 Android Studio 来做这件事,但我都无法运行该项目来开始弄清楚它是如何工作的。此外,该项目的最后一次提交是大约 1 年前,这让我非常担心如果出现问题我会陷入死胡同。因此,事不宜迟,这是我基于@Bostone 的解决方案:

1.- 首先你必须创建一个 Button 和一个嵌套在 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 对不起,但我认为您的问题与列表视图有关,列表视图总是加载足够的元素以适应屏幕中的可用大小。那么,如果没有可用的大小......在列表视图中,只有当用户需要查看它时才会创建可查看之外的下一个元素,这是因为它可以节省内存。如果我的修复有这个问题,我会很难过,但我认为你可以通过改变线性布局高度属性来修复它。尝试匹配父母。还可以看看在不使用默认可见性的情况下会发生什么。 ...也许您可以覆盖列表视图行为。告诉我。
  • 我们应该用动画来实现,而不是去库。
【解决方案4】:

在我的应用程序中,我使用了 Riya Gayasen 的手风琴视图。这很容易上手并且运行良好。这就是我所做的。

  1. 从以下位置下载源代码的 zip https://github.com/riyagayasen/Android_accordion_view
  2. 解压缩并将“easyaccordion”文件夹复制到项目的根目录 目录(包含“app”文件夹的目录)
  3. 在您的项目根 settings.gradle 文件中添加 :easyaccordion。这里 我的文件是这样的: include ':app',':easyaccordion'
  4. 在您的 app/build.gradle 文件中,将以下行添加到 依赖块。 implementation 'com.riyagayasen.android:easyaccordion:1.0.3'
  5. 就是这样。您可以开始使用内部的组件 布局。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-26
    • 1970-01-01
    相关资源
    最近更新 更多