动态添加可点击视图到ScrollView

时间:2017-06-20 20:08:14

标签: android xml android-layout onclicklistener

我是Android开发的新手,如果答案对其他人来说显而易见,请道歉......

我想为我的组织创建一个任务跟踪器应用程序,其中任务集通常大致相同。这是一个模型: Project Progress Mockup

模型显示通用任务名称,但真实任务名称将具有不同的任务名称和更多任务名称。

我需要一些帮助来整理布局设计。从概念上讲,这非常简单,但Android中的实现并不是那么简单......

我以为我应该创建一个"任务项目"包含3个视图的类:任务名称的文本视图,进度条&另一个文本视图的百分比。然后我想创建一个这些任务项的数组。

在XML中设置所有这些并不是那么糟糕,但我需要它是动态的,因为它并不总是相同的列表。此外,使用XML有点暴力,因为我需要为此活动中的每个项目提供唯一代码,而不是动态循环遍历列表。

好像我需要一个ScrollView。我在另一篇文章中看到以下声明:

  

ScrollView是一个FrameLayout,意味着您应该在其中放置一个包含要滚动的全部内容的子项;这个子本身可能是一个具有复杂对象层次结构的布局管理器。经常使用的子项是垂直方向的LinearLayout,呈现用户可以滚动的顶级项目的垂直数组。

所以我理解我需要将我的任务项列表添加到类似于LinearLayout的内容中,该内容嵌入在ScrollView中。 我可以简单地用XML设置,对吧?

然后,对于每个任务项,我需要: - 创建2个TextView - 将文本设置为任务名称&百分比,分别 - 设置字体,字体大小,文本颜色等。 - 设置TextView位置 - 创建进度条 - 设置进度条位置&百分比

这些都不是微不足道的。所以我想知道为单个任务项设置XML布局会更容易吗?然后以某种方式加载()XML布局。希望从那里我可以简单地设置文本&进度条百分比。 这会起作用吗,还是我错了?另外,我如何为此设置XML?我是否将活动添加到项目中,或者只添加其他XML文件?

最后,我需要任务名称可点击,这样我就可以捕获点击和放大打开一个新活动,显示任务的子任务&允许用户更改状态。因此,任务名称TextView需要具有ID。 我应该创建任务名称按钮而不是TextViews吗?如何动态设置ID?我看到Views有一个setId(int id)方法。但是我怎么知道要使用什么整数? Android参考View.html声明:

  

视图ID在整个树中不一定是唯一的,但它很好   实践,以确保它们至少在部分内是独一无二的   你正在寻找的树。

如何确保这些ID是唯一的?

在XML文件中,ID不是数字,而是文本,例如:

android:id="@+id/my_button"

这在以下代码中引用:

Button myButton = findViewById(R.id.my_button);

但我如何创建&使用唯一的数字ID来捕获这些任务名称上的点击事件?

感谢您提供的任何指示!

新信息&问题...

我的基本功能有用,但有些事情并不合适:

  1. 如果您查看我更新的模型Updated Project Progress Mockup,我希望以绿色突出显示的区域滚动,而其余区域保持原位。但是,顶部的标题是&底部的按钮滚动屏幕,不会再回来。不确定我做错了什么。
  2. 我的布局xml如下所示:

    <android.support.constraint.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/summary"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/colorBG"
    tools:ignore="LabelFor"
    tools:context="com.myorg.myapp.ProjSummary">
    
    <TextView
        android:id="@+id/txtSumm"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/summ"
        android:textAppearance="@style/TextAppearance.AppCompat"
        android:textColor="@color/colorPrimaryDark"
        android:textSize="18sp"
        app:layout_constraintTop_toTopOf="parent"
        android:layout_marginTop="8dp"
        app:layout_constraintBottom_toTopOf="@+id/txtProj"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"/>
    
    <TextView
        android:id="@+id/txtProj"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/proj"
        android:textAppearance="@style/TextAppearance.AppCompat"
        android:textColor="@color/colorPrimaryDark"
        app:layout_constraintTop_toBottomOf="@+id/txtSumm"
        android:layout_marginTop="8dp"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toLeftOf="@+id/edtProj"/>
    
    <EditText
        android:id="@+id/edtProj"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:inputType="textPersonName"
        android:paddingTop="5dp"
        android:paddingBottom="0dp"
        android:paddingStart="0dp"
        android:paddingEnd="0dp"
        android:textColor="@color/colorPrimaryDark"
        android:textSize="14sp"
        app:layout_constraintTop_toBottomOf="@+id/txtSumm"
        app:layout_constraintLeft_toRightOf="@+id/txtProj"
        app:layout_constraintRight_toRightOf="parent"/>
    
    <ImageView
        android:id="@+id/imgLogo"
        android:layout_width="120dp"
        android:layout_height="48dp"
        android:scaleType="fitXY"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toLeftOf="@+id/btnSend"
        app:srcCompat="@mipmap/my_logo"
        android:contentDescription="@string/org_logo"/>
    
    <Button
        android:id="@+id/btnSend"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:backgroundTint="@color/colorSecondaryDark"
        android:text="@string/send"
        android:textColor="@color/colorButtonText"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toRightOf="@+id/imgLogo"
        app:layout_constraintRight_toRightOf="parent"/>
    
    <android.support.v7.widget.RecyclerView
        android:id="@+id/rvTaskList"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintTop_toBottomOf="@+id/txtProj"
        app:layout_constraintBottom_toTopOf="@+id/imgLogo"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"/>
    

    1. 我的上一个任务项永远不会显示。 (例如,如果我有10个任务项,则只显示前9个。)在我的活动类中,我有一个ArrayList用于任务项的摘要列表:

      private ArrayList _alSummaries;
      
    2. 在我的RecyclerView.Adapter类中,我有以下方法:

          @Override
      public int getItemCount() { return _alSummaries.size(); }
      

      我应该看的其他地方吗?

      谢谢!

      进一步更新:

      1. 在我的布局中我有......
      2. android:layout_height="wrap_content"

        而不是wrap_content,它应该是&#34; 0dp&#34;。看起来像是Android中的一个错误,实际上 - 如果我说的是wrap_content,那绝不会导致视图变得比可用的空间大(由约束设置)。

        1. 问题解决了 - 不是界面问题,而是将数据加载到应用程序中的代码。

1 个答案:

答案 0 :(得分:1)

  

所以我想知道为单个任务项设置XML布局会更容易吗?然后以某种方式加载()XML布局。希望从那里我可以简单地设置文本&amp;进度条百分比。

这是Recycler View适配器的功能。您有一个包含三个简单视图的xml布局:文本,条形图和另一个文本。

现在在您的代码中(在适配器中),您可以为每一行充气并单独设置文本和进度条。

  

我应该创建任务名称按钮而不是TextViews吗?如何动态设置ID?

你不需要这样做。您可以只分配自定义onClick侦听器,它们可以在适配器代码中执行您想要的操作。

对于初学者来说,设置绝对不是一件容易的事,但是一旦掌握了它,你会发现它是一个非常有价值的工具。

在这里查看官方教程:https://developer.android.com/training/material/lists-cards.html