【问题标题】:How do I know the ID's of views if I am inflating a view multiple times in the same parent on button click?如果我在按钮单击时在同一个父级中多次放大视图,我如何知道视图的 ID?
【发布时间】:2011-12-13 11:44:26
【问题描述】:

我有一个困难的情况,让我这么说吧,我希望用户使用我的 3 个文本字段来设置警报数据,在填写信息后,我给他一个选项来为此设置另一个警报目的我使用一个按钮。我在表格布局中有三个表格行,它们在 child.xml 文件中定义,每个元素都有一个 Id 集。在我的活动中,我在按钮单击事件上多次为 child.xml 充气,并且我能够成功地将其充气多次。但我的问题是,因为我在运行时多次膨胀同一个 xml 文件(我不知道多少次),所以我很困惑如何从 TextViews 等特定文本字段中检索数据并通过 a唯一的 ID,因为我需要这样做。 你是怎么做的?

【问题讨论】:

    标签: android android-layout android-view


    【解决方案1】:

    我会以编程方式讨论它。

    当用户请求新的警报时,您就可以扩充您的 xml 文件。此时,在您的 Activity 中保留对膨胀视图的引用(在列表或其他类型的集合中)。

    所以当你想检索数据时,不要使用findViewById,而是使用你的参考。

    【讨论】:

    • 我使用下面的代码来膨胀它,我如何保留参考? myRoot = (LinearLayout) findViewById(R.id.wrapper); tl=(TableLayout)findViewById(R.id.tablelyt1); LayoutInflater inflater=(LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); inflater.inflate(R.layout.inflater, myRoot);
    • this.view = inflater.inflate(R.layout.inflater, myRoot); 或者更好的是,将其添加到 this.viewList(这是一个 List
    • 我明白了,我们可以使用List计算元素的数量,但我想知道如何从TextViews中获取数据,假设我膨胀了10个表格布局那么我如何收集数据来自他们所有人?我最困惑的是,当我知道它们都共享相同的 ID 时,我将如何区分它们
    • 当你需要使用一个时,从列表中检索它,而不是从活动中使用它的 id。如果您不清楚,那么您需要就您想要实现的目标提供更多详细信息。
    • 您的意思是说,在将视图添加到列表后,它现在包含对视图中所有 UI 元素的引用?我想从所有膨胀视图的所有文本视图中收集数据并将其填充到不同的文本视图中。请看一下我的实现 public void getData(){ for(int i=0;i
    【解决方案2】:

    也许这会有所帮助...


                LinearLayout ll=(LinearLayout) findViewById(R.id.i1);   ///main xml file which contains the layout i m inflating
                String str[]={"a","b","c"};
                View vi[]=new View[3];
                LayoutInflater li=(LayoutInflater)this.getSystemService(LAYOUT_INFLATER_SERVICE);
                for(int i=0;i<3;i++){
                      View v=li.inflate(R.layout.addit, null);
                      TextView t=(TextView) v.findViewById(R.id.t1);
                      t.setText(str[i]);
                      ll.addView(v);
                          vi[i]=v;
                }
                TextView t1=new TextView(this);
                TextView t2=new TextView(this);
                TextView t3=new TextView(this);
                TextView r1=(TextView) vi[0].findViewById(R.id.t1);
                TextView r2=(TextView) vi[1].findViewById(R.id.t1);
                TextView r3=(TextView) vi[2].findViewById(R.id.t1);
                t1.setText(r1.getText());
                t2.setText(r2.getText());
                t3.setText(r3.getText());
                ll.addView(t1);
                ll.addView(t2);
                ll.addView(t3);
    
                 setContentView(ll);
    

    我的 addit.xml 文件包含以下内容:

           <?xml version="1.0" encoding="utf-8"?>
           <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:id="@+id/l2"
              android:layout_width="match_parent"
              android:layout_height="100dp"
              android:orientation="vertical" >
    
           <TextView
              android:id="@+id/t1"
              android:layout_width="fill_parent"
              android:layout_height="40dp"
              android:text="" />
           </TextView>
           </LinearLayout>
    

    在这里,我从 addit.xml 动态添加布局 3 次,其中包含 id 为 t1 的文本视图。 对于每个文本视图,我从字符串数组 str 中设置一个文本 .. 并将每个视图对象 v 添加到数组中以供引用... 现在,如果我想获取每个 textview 的文本,我可以使用对存储在数组中的视图的引用,并通过 id 查找文本视图,就像在代码中从每个 textview 获取文本一样

    【讨论】:

    • 早些时候我在拍摄快照时尝试在edittext上执行此操作,但后来决定在textview上执行此操作,因此edittext框在图片中可见...
    【解决方案3】:

    我会从基础开始

    <Layout>
    <Button1>
    </layout>
    

    活动中

    Button btn;View view1=null;
    ///Inflate file if view is null
    first time when you inflating
    view1=inflate
     btn=view1.findViewbyid();
    

    现在假设您已经为另一个视图充气,但 view1 的值没有改变,那么 btn 将包含对该按钮的引用。当它变得可见时。它将像普通按钮一样工作。

    【讨论】:

    • 不,我仍然很困惑,我明白了,我们可以使用 List 来计算元素的数量,但我想知道如何从 TextViews 获取数据,假设我膨胀了 10 个表格布局然后我如何从他们那里收集数据?我最困惑的是,当我知道它们都共享相同的 ID 时,我将如何区分它们
    • 您可以使用整数设置 id 并每次递增以不同地识别每个元素。
    • 我在 xml 文件中定义了他们的 ID。我想在动态膨胀视图后访问这些字段。
    • 请看看我的实现 for(int i=0;i
    • 问题是 onclicklistener 只为第一个被膨胀的视图设置,我希望它在所有可能的文本视图上实现。
    【解决方案4】:

    只要记住inflate() 每个实例时返回的View 引用即可。当您需要从中读取文本时,将它们投射到 TextView

    【讨论】:

    • 我这样充气 myRoot = (LinearLayout) findViewById(R.id.wrapper); tl=(TableLayout)findViewById(R.id.tablelyt1); LayoutInflater inflater=(LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); inflater.inflate(R.layout.inflater, myRoot);
    • 你需要存储从inflater.inflate()返回的View。目前您忽略了返回值。
    猜你喜欢
    • 1970-01-01
    • 2020-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-17
    相关资源
    最近更新 更多