【问题标题】:What happens if I use the same id for several widgets in different layouts?如果我对不同布局中的多个小部件使用相同的 id 会发生什么?
【发布时间】:2011-12-21 03:12:05
【问题描述】:

目前我小心翼翼地为每个小部件使用不同的 ID,但是如果我对不同布局 xml 文件中的某些小部件使用相同的 ID,那么我对 findViewById 的调用会发生什么情况?它会感到困惑并从错误的布局文件中返回一个小部件吗?

我问是因为我正在考虑在其他一些视图中包含一个视图(带有一排按钮),然后每个屏幕类都必须为包含的视图上的每个按钮分配一个稍微不同的行为。但要做到这一点,他们会在同一个 ID 上调用 findViewById。 例如,目前我在每个文件中都这样做:

final ImageButton homeButton = (ImageButton)this.findViewById(R.id.rshome_button);
homeButton.setOnClickListener(new BottomButtonClickListener());

final ImageButton hotButton = (ImageButton)this.findViewById(R.id.rshotlist_button);
hotButton.setOnClickListener(new BottomButtonClickListener());

final ImageButton locButton = (ImageButton)this.findViewById(R.id.rsbot_map);
locButton.setOnClickListener(new BottomButtonClickListener());

final ImageButton sendButton = (ImageButton)this.findViewById(R.id.rssend_button);
sendButton.setOnClickListener(new BottomButtonClickListener());

但我将每个文件中的 R.id 更改为指向每个关联布局中的小部件。如果我可以使用一个 R.id 就好了,这样我就不必调整每个布局文件和每个屏幕类。

谢谢

【问题讨论】:

    标签: android layout


    【解决方案1】:

    是的,您可以在不同的布局中使用相同的ids。事实上,这样做可能是个好习惯。

    【讨论】:

      【解决方案2】:

      只要您不在同一个活动中实例化两个布局就应该没问题。但从未尝试过,我不想保证。

      不过,如果 Android 代码生成器出错,我不会感到惊讶,因为它可能会尝试在您的 R.java 文件中创建两个 R.id.rshome_button 条目。

      【讨论】:

      • 那么它如何知道我们正在寻找哪一个?
      【解决方案3】:

      您自己尝试的最佳方式。

      但你确实 setContentView(R.layout.your_layout);

      因此,如果您调用 findViewById,它将在 your_layout 中查找具有给定 id 的小部件

      这就是为什么您可以在不同的布局中使用相同的 id。

      【讨论】:

      • R.id.view_id 是在编译时生成的静态整数,在 setContentView() 运行之前。
      猜你喜欢
      • 1970-01-01
      • 2011-04-15
      • 1970-01-01
      • 2012-06-27
      • 2017-04-11
      • 1970-01-01
      • 1970-01-01
      • 2016-11-08
      • 1970-01-01
      相关资源
      最近更新 更多