如何指定在多次添加的布局中单击哪个视图

时间:2016-09-01 09:36:22

标签: android android-layout layout

我有一个布局,可以获取用户的孩子信息。让我们说这个布局会提供有关孩子的名字,姓氏和年龄的信息。我正在使用EditText进行输入。并且有一个微调器显示儿童过敏类型,在选择1过敏类型时,它必须从webservice获取其细节并在textview中填充这些细节。

因此,通过这种方式,用户可以根据需要添加多个孩子。问题出现在那里。让我们说用户现在已经添加了4次布局,他选择了子项1的微调器并调用了服务,它获取信息并在最后添加的布局文本视图中填充它。

根据预期,细节应填写相应添加的每个布局的每个文本视图。

混淆:

  1. 如何确切地获取点击的视图,然后如何在该视图的相同布局中执行操作而不是最近添加的视图?
  2. 我正在为具有上面指定的特定字段集的布局进行充气。所以我维护了添加的每个布局的数组列表,所以有没有解决方案在该布局中获得完全相同的视图及其对应的视图?
  3. 更新1:我的问题的一些想法

    主要活动有一个名为" Add More Children"的按钮。当用户单击此按钮时,包含子信息的布局会添加到ScrollView的指定区域中,以便用户可以根据需要添加任意数量的子项。

    所以基本上我已经在下面画了一些视图,因为在以下布局中有太多的视图名为children layout.But这个布局显示了需要完成的工作类型。所以请看下面并有一些想法

    Children layout

    为了演示,您可以看到有不同的编辑文本和微调器。旋转器从Web服务更新,每个子节点可能有不同的数据从webservice加载到微调器中。这整个布局膨胀为主要活动。点击按钮点击添加儿童。所以我在滚动视图中添加了这个按钮

    private View addChildLayout(int childLayoutid, LinearLayout Targetlayout) {
        //where childLayoutid is a layout resourse id of childern layout
        // where Target layout is a scrollview in my fragment 
        LayoutInflater inflater = LayoutInflater.from(getActivity());
        View inflatedLayout1 = inflater.inflate(childLayoutid, null, false);
        inflatedLayout1.setId(numOfChildAdded);// numOfChildAdded is int number            of children added by user so far
        Targetlayout.addView(inflatedLayout1, 0);
        numOfAddedChildLayout.add(inflatedLayout1);//this is an array list i am creating to keep track of each layout added by user on add button click 
    
        return inflatedLayout1;
    }
    

    在布局中添加此另一个方法后,我调用该方法查找此布局的ID并设置每个视图的单击侦听器,即旋转器或编辑文本或任何需要的内容。现在假设用户添加了一个孩子。并点击spinnerAllergy类型获取子类别并填充spinnerSubCatogry,再点击spinnerSubcategory再次调用Web服务并获取Textview中的过敏和填充细节(图中所示的大框)

    现在主要的问题出现在用户添加2号儿童时。现在假设用户添加了2个孩子,但他点击了Child1的spinnerAllergy,child1微调器运行Web服务但填充了Child2的spinnerSubcategory。

    看起来当添加新子节点时,单击侦听器引用新添加的新布局。

    这是主要问题。我希望每个布局中的每个视图在其视图和边界中相应地工作。我的意思是child1布局视图点击监听器应该填充其视图而不是当前添加的布局视图。

    我认为这是足够的信息来获得一些明确的想法。

    请帮帮我,我已经被困在这里2天了。我的所有设计都运作良好。

3 个答案:

答案 0 :(得分:1)

正如您在上面所述,您正在跟踪(列出)您添加的每个视图。我建议你使用那个

以下是您正在使用的行并设置ID,因此它的意思是每个父级具有不同的ID,其子视图具有相同的ID,

 View inflatedLayout1 = inflater.inflate(childLayoutid, null, false);
inflatedLayout1.setId(numOfChildAdded);

当您添加具有不同ID的每个布局时,为什么不简单地获取父级,然后再次获取具有特定ID的子级,以进行演示

假设您的布局中有一个textview,并且在Linear布局下,因为该线性布局具有相对布局作为根/主布局,并且每个主布局具有与上面不同的ID。这就是你将如何进入顶部(父ID)

  ViewGroup row = (ViewGroup) yourTextView.getParent().getParent;
  TextView textView = (TextView) row.findViewById(R.id.tvClassLevels); // the next view you can find 

所以在这里我建议对每个视图执行此操作,然后设置单击侦听器。 这可能效率不高,但这可行。我曾经这样做过,当我给自定义布局充气时,但每次充气虽然可能很快就会记住但是成本很高,你需要在getview附近实现一些逻辑(因为我们在适配器中实现它)

  

为什么我要做两次getParent()。getParent()   正如我所说,我的textview在linearlayout中,线性布局位于main / root布局中,因此我们想要接近mainlayout,因为我们知道它是唯一具有不同Id的,因此我们正在做两次getParent()因为Textview将LinearLayout作为第一个Parent,然后是根布局,所以如果你有另一个布局的视图,你需要自己挖掘它。

我再说一遍,它可能不是一个很酷或最好的实现,但它的工作原理。至少它对我有用。

答案 1 :(得分:0)

我认为问题是:您的布局中的不同视图具有 SAME ID,因为您从同一xml布局中进行了充气。

您有不同的方法来解决这个问题:

  • 跟踪变量并在添加子视图时增加计数。通货膨胀完成后,您可以在新创建的视图上调用setId(正如Abdul Salam Ali的答案中所述)。虽然android中的视图ID是在编译时生成的(如果我错了,请纠正我),这在实践中应该完美无缺。
  • 在res / values文件夹中创建一个Ids资源文件,并预先定义一些Id值以供将来使用。它保证所有id值都是不同的。但正如您所说,用户可以根据需要添加任意数量的子信息,这可能不是最佳选择。
  • 使用Random生成不同的ID。

请注意,即使您的布局中有相同的ID,只要您调用ViewGroup(或类似于此)的findViewById子项具有相同的ID,您的代码逻辑就会正确一个独特的身份。见this

答案 2 :(得分:-1)

对你的设计提出一些建议。

  1. 使用listview和适配器设计,而不是在编程中生成视图。

    <强>一个。添加新项

    使用浮动操作按钮。 https://material.google.com/components/buttons-floating-action-button.html#buttons-floating-action-button-floating-action-button

    <强> B中。删除项目

    使用某些列表控件或多重选择器删除不需要的项目。https://material.google.com/components/lists-controls.html#lists-controls-types-of-list-controls

  2. 使用listview显示您的项目,而不是在代码中生成布局。

    https://material.google.com/components/lists.html#lists-usage

  3. 要编辑特定的子信息,建议使用全屏对话框进行编辑。

    https://material.google.com/components/dialogs.html#dialogs-full-screen-dialogs

  4. 以上是我对您的设计的建议,因为如果您希望让点击后的视图的父级在布局中找到您的实际位置,然后发送以收听相应的点击事件,那将很困难。如果父级中存在任何嵌套视图,则很难维护并且您的代码很难调试。尝试分离每个部分以帮助您调试代码中的错误。