通过获取每个子项的位置动态地将子项添加到 LinearLayout

2023-11-25

我在获取孩子的位置时遇到问题线性布局。首先,我动态添加一些按钮,然后尝试返回每个子项的索引并将其显示到TextView。我在这里分享代码:

java源代码:

private String[] categories;

private LinearLayout ll;
private TextView tv;

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    categories = getResources().getStringArray(R.array.categories);

    tv = (TextView) findViewById(R.id.text);
    ll = (LinearLayout) findViewById(R.id.hsvLinearLayout);

    for(int i = 0; i < categories.length; i++) {
        Button btn = new Button(this);
        btn.setText(categories[i]);
        btn.setOnClickListener(buttonClick);
        ll.addView(btn);
    }
}

OnClickListener buttonClick = new OnClickListener() {
    public void onClick(View v) {
        tv.setText(ll.indexOfChild(v));
    }
};

XML结构:

<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>

<HorizontalScrollView
    android:id="@+id/Footer"
    android:orientation="horizontal"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:scrollbars="none"
    android:fadingEdge="none"
    >

    <LinearLayout
        android:id="@+id/hsvLinearLayout"
        android:orientation="horizontal"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        >

    </LinearLayout>

</HorizontalScrollView>

<TextView
    android:id="@+id/text"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    />

资源:

<string name="today">Today</string>
<string name="life">Life</string>
<string name="corner">Corner</string>
<string name="banks">Banks</string>
<string name="it">IT</string>
<string name="fun">Fun</string>

<array name="categories">
    <item>@string/today</item>
    <item>@string/life</item>
    <item>@string/corner</item>
    <item>@string/banks</item>
    <item>@string/it</item>
    <item>@string/fun</item>
</array>

动态添加很好,但是我设置的方式单击监听器产生一些错误。任何帮助都会有用的!这样做的目的是如果我想添加一个或多个按钮到水平滚动视图不需要编辑很多文件,只需转到刺.xml并创建一个新项目到类别数组!

这是什么LogCat生产:

07-12 22:37:17.680: INFO/System.out(331): waiting for debugger to settle...
07-12 22:37:17.900: INFO/System.out(331): debugger has settled (1441)
07-12 22:37:20.870: INFO/ActivityManager(61): Displayed activity com.test/.TestDynam: 10203 ms (total 10203 ms)
07-12 22:37:25.552: WARN/ResourceType(331): No package identifier when getting value for resource number 0x00000000
07-12 22:37:26.871: DEBUG/dalvikvm(132): GC freed 190 objects / 8976 bytes in 901ms

澄清一下 - 应用程序启动时没有任何错误,但是当我单击按钮时,它会从上面的日志中生成这一行:

07-12 22:37:25.552: WARN/ResourceType(331): No package identifier when getting value for resource number 0x00000000

这是来自debugger:

TestDynam [Android Application] 
    DalvikVM[localhost:8611]    
        Thread [<3> main] (Suspended (exception Resources$NotFoundException))   
            ViewRoot.handleMessage(Message) line: 1704  
            ViewRoot(Handler).dispatchMessage(Message) line: 99 
            Looper.loop() line: 123 
            ActivityThread.main(String[]) line: 4203    
            Method.invokeNative(Object, Object[], Class, Class[], Class, int, boolean) line: not available [native method]  
            Method.invoke(Object, Object...) line: 521  
            ZygoteInit$MethodAndArgsCaller.run() line: 791  
            ZygoteInit.main(String[]) line: 549 
            NativeStart.main(String[]) line: not available [native method]  
        Thread [<13> Binder Thread #2] (Running)    
        Thread [<11> Binder Thread #1] (Running)

你的问题是资源...... 您使用 setText(int) 方法(该索引是 int...)来查找资源而不是字符串,这不是您可以抛出任何类型并获取字符串的 StringBuilder。 你需要更换

tv.setText(ll.indexOfChild(v));

with

tv.setText(Integer.toString(ll.indexOfChild(v)));

如果你想要一点点效率:

public class TestActivity extends Activity {

    private String[] categories;

    private LinearLayout ll;
    private TextView tv;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        categories = getResources().getStringArray(R.array.categories);

        tv = (TextView) findViewById(R.id.text);
        ll = (LinearLayout) findViewById(R.id.hsvLinearLayout);

        for(int i = 0; i < categories.length; i++) {
            Button btn = new Button(this);
            btn.setText(categories[i]);
            btn.setOnClickListener(buttonClick);
            ll.addView(btn);
            int idx = ll.indexOfChild(btn);
            btn.setTag(Integer.toString(idx));
        }
    }

    OnClickListener buttonClick = new OnClickListener() {
        public void onClick(View v) {
            String idxStr = (String)v.getTag();
            tv.setText(idxStr);
        }
    };

}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通过获取每个子项的位置动态地将子项添加到 LinearLayout 的相关文章

随机推荐

  • rows.add 和 importRow 之间的区别

    在vb net中向数据表添加行时 rows add和importRow有什么区别 Dim dt As DataTable Dim dr As DataRow Add row this way dt rows add dr or this w
  • 了解 malloc 和 free 指针

    指针在 C 中是一个非常棘手的东西 对于很多人来说很难理解它 所以为了更好地理解我编写了以下代码 include
  • 在 Spring Webflux 功能应用程序中验证请求的最佳方法是什么

    在传统的 Web 应用程序中 很容易在控制器方法中验证请求主体 例如 ResponseEntity create Valid ResponseBody Post post 如果是 MVC 应用程序 我们可以通过注入一个来收集错误Bindin
  • 编译 CUDA 示例出现构建错误

    我运行的是 Windows 7 64 位 带有 Visual Studio 2008 我安装了 CUDA 驱动程序和 SDK SDK 附带了很多示例 包括编译的可执行文件和源代码 编译后的可执行文件运行得非常好 当我打开 vc90 解决方案
  • jQuery Ajax:如何等到 *async* 请求成功完成后再继续?

    我在加快 ajax 速度时遇到问题and功能性的 这是伪 原型代码 function blah1 arg1 arg1 is an array roughly 10 elements var arr each arg1 function i
  • Laravel:Form::open() 中的 HTTPS

    我在我的登录中为我的网站使用 SSL Cloudflare HTTPS 因为我使用 Laravel 不会将我的网站链接转换为 SSL 版本 它显示http版本 我如何强制 Laravel 使用https for me 例如
  • 不安全的 JavaScript 尝试访问 Google Chrome 中的框架

    我们的网络应用程序 基于 HTML5 SVG 和 JS 在除 Google Chrome 之外的所有浏览器中运行良好 在 Google Chrome 中 正常的 javascript 事件运行良好 但是 附加到 iFrame 的所有 jav
  • PowerShell - Set-Culture 似乎没有改变任何东西

    我有一个云服务 Web 角色 需要在其上运行一些 PowerShell 以确保服务器始终设置为正确的区域性 en AU 原因是微软可以随时重置文化价值观 当我跑步时 Get Culture I get 1033 en US English
  • 从数组中删除多个索引

    我有一个数组 我想删除一堆索引 var arr 0 1 2 3 4 5 6 var rmIndices 1 4 5 从 arr 中删除索引 1 4 5 的最佳方法是什么 注意PermutationGenerator在 Swift 3 中将会
  • 使用 Python 的 Vcard 解析器

    我正在解析我的 vcard 信息 复制到 txt 文件 以提取name number并将其放入字典中 数据样本 BEGIN VCARD VERSION 2 1 N MEO Apoio FN Apoio MEO TEL CELL PREF 1
  • SQL Server 计算列

    我有两列 都是整数 Wins and Losses 我有一个计算列WinPercentage as a decimal 14 3 我希望这是 WinPercentage Wins Losses Wins 其语法是什么 CREATE TABL
  • 如何在 gtsummary 中向“未知”添加百分比

    我有一个连续变量 其中有很大比例的未知数 我的顾问要求我将百分比放在该栏中的旁边 这个 reprex 模仿了我想做的事情 library tidyverse library gtsummary trial gt included with
  • 在 JavaScript 中使用“prototype”与“this”?

    有什么区别 var A function this x function do something and var A function A prototype x function do something 这些例子有非常不同的结果 在查
  • python 与 __le__、__ge__ 的错误?

    是我还是Python对以下代码感到困惑 我希望 le 被称为a lt ab not ge usr bin env python2 class B object def ge self other print ge unexpectedly
  • 按行计算平均日期

    我希望按行获取平均日期 其中每行包含两个日期 最终我找到了一个方法 发布在下面 不过 我使用的方法似乎比较麻烦 有没有更好的办法 my data read table text OBS MONTH1 DAY1 YEAR1 MONTH2 DA
  • 错误:找不到函数“%>%”

    我正在 R 中运行一个示例 完成这些步骤 到目前为止一切正常 除了此代码产生错误 words lt dtm gt as matrix gt colnames gt function x x nchar x lt 20 错误 找不到函数 gt
  • 从 WAV 文件中解码 DTMF

    继我的先前的问题 我的目标是从 C 检测 WAV 文件中的 DTMF 音调 然而 我真的很难理解这是如何做到的 我知道 DTMF 使用频率组合 并且可以使用 Goertzel 算法 以某种方式 我抓取了 Goertzel 代码片段 并尝试将
  • 服务器端文件浏览

    我正在开发一个 Web 应用程序 它从一组文本文件中读取数据并将其映射到 MySQL 数据库 目前 该表单需要手动输入文件路径 但我想向该字段添加一个文件选择器 以使该部分的设置不那么繁琐 我找到的解决方案都允许选择单个文件 但我正在寻找一
  • 如何使用 Selenium 自动化 Firefox Mobile?

    我需要在 Firefox Mobile 中运行 Selenium 测试 有人能描述一个简单的方法来做到这一点吗 我的调查表明 Firefox 移动版不受支持Appium one two Firefox Desktop has built i
  • 通过获取每个子项的位置动态地将子项添加到 LinearLayout

    我在获取孩子的位置时遇到问题线性布局 首先 我动态添加一些按钮 然后尝试返回每个子项的索引并将其显示到TextView 我在这里分享代码 java源代码 private String categories private LinearLay