【问题标题】:R.java having 2 members with same name layoutR.java 有 2 个具有相同名称布局的成员
【发布时间】:2017-06-10 10:55:56
【问题描述】:

我可能会问一个蹩脚的问题,但我是 android 新手,我找不到这个问题的解决方案。

当我在电脑中打开R.java 文件以了解setContentView(R.layout.activity_main) 的工作原理时。

所以我打开了我的 R.java 文件并简单地搜索了键 layout 所以我在我的 R.java 文件中找到了 2 个条目,所以我很困惑编译器如何识别 @987654324 @member 我目前正在尝试引用。我将 R.java 文件的 sn-ps 包含声明 layout 成员的行。

/* AUTO-GENERATED FILE.  DO NOT MODIFY.
 *
 * This class was automatically generated by the
 * aapt tool from the resource data it found.  It
 * should not be modified by hand.
 */

package com.myapp;

public final class R {
    public static final int layout=0x7f0100a9;
        /** <p>Must be a reference to another resource, in the form "<code>@[+][<i>package</i>:]<i>type</i>:<i>name</i></code>"
or to a theme attribute in the form "<code>?[<i>package</i>:][<i>type</i>:]<i>name</i></code>".
         */

     public static final class layout {
        public static final int abc_action_bar_title_item=0x7f040000;
        public static final int abc_action_bar_up_container=0x7f040001;
        public static final int abc_action_bar_view_list_nav_layout=0x7f040002;
        public static final int abc_action_menu_item_layout=0x7f040003;
        public static final int abc_action_menu_layout=0x7f040004;
        public static final int abc_action_mode_bar=0x7f040005;
        public static final int abc_action_mode_close_item_material=0x7f040006;
        public static final int abc_activity_chooser_view=0x7f040007;
        public static final int abc_activity_chooser_view_list_item=0x7f040008;
        public static final int abc_alert_dialog_button_bar_material=0x7f040009;
        public static final int abc_alert_dialog_material=0x7f04000a;
        public static final int abc_dialog_title_material=0x7f04000b;
        public static final int abc_expanded_menu_layout=0x7f04000c;
        public static final int abc_list_menu_item_checkbox=0x7f04000d;
        public static final int abc_list_menu_item_icon=0x7f04000e;
        public static final int abc_list_menu_item_layout=0x7f04000f;
        public static final int abc_list_menu_item_radio=0x7f040010;
        public static final int abc_popup_menu_item_layout=0x7f040011;
        public static final int abc_screen_content_include=0x7f040012;
        public static final int abc_screen_simple=0x7f040013;
        public static final int abc_screen_simple_overlay_action_mode=0x7f040014;
        public static final int abc_screen_toolbar=0x7f040015;
        public static final int abc_search_dropdown_item_icons_2line=0x7f040016;
        public static final int abc_search_view=0x7f040017;
        public static final int abc_select_dialog_material=0x7f040018;
        public static final int activity_main=0x7f040019;
        public static final int notification_media_action=0x7f04001a;
        public static final int notification_media_cancel_action=0x7f04001b;
        public static final int notification_template_big_media=0x7f04001c;
        public static final int notification_template_big_media_narrow=0x7f04001d;
        public static final int notification_template_lines=0x7f04001e;
        public static final int notification_template_media=0x7f04001f;
        public static final int notification_template_part_chronometer=0x7f040020;
        public static final int notification_template_part_time=0x7f040021;
        public static final int select_dialog_item_material=0x7f040022;
        public static final int select_dialog_multichoice_material=0x7f040023;
        public static final int select_dialog_singlechoice_material=0x7f040024;
        public static final int support_simple_spinner_dropdown_item=0x7f040025;
    }
}

我想知道编译器如何在编写setContentView(R.layout.acivity_main) 时解析实际的layout 元素,因为有一个int 变量和一个同名的内部类layout

【问题讨论】:

  • 不要只是-1问题。我是新手,所以这可能是一件我无法理解的非常简单的事情,但请回答这个问题。

标签: java android android-layout r.java-file


【解决方案1】:

一个是class,另一个是int:上下文没有歧义。

当两种解释都可能时,它解析为使用变量(而不是类型):

public class Test {
    public static void main(String... args) {
        {
            Value x = new Value();
            // use the variable x
            System.out.println(x.i);
            // System.out.println(x.j); // does not compile
        }
        // use the type x
        System.out.println(x.i);
    }
}

class x {
    static int i = 42;
    static int j = 1;
}
class Value {
    int i = 100;
}

输出是:

100
42

编辑:这不是您的问题中发生的情况。

你是对的,会有歧义:

public class Test {
    public static void main(String... args) {
        // does not compile
        System.out.println(R.layout.x);
    }
}

class R {
    static final class layout {
        static int x = 42;
    };
    static final int layout = 25;
}

实际上没有,因为在生成的R.java 中,int layout 在一个内部类中:

public final class R {
    public static final class attr {
        public static final int layout = …;
    }
    public static final class layout {
        //…
    }
}

【讨论】:

  • 感谢您的回复,但是,如果我写 R.layout 那么将被引用,因为两者都在同一个类中,还是类似于后期绑定或覆盖的概念???
  • 但即使是类也写在 R 类中,所以场景就像类 R 包含 2 个成员 1) int 成员 layout,2) 内部类 layout 所以对于这两者来说,上下文是只有class R
  • 如果class Xint iclass i 作为class X 的内部类怎么办?那会是什么情况呢?
  • 我弄错了,layout 成员在一个单独的内部类中,因此它不会产生任何歧义,因为我弄错了大量代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-09
  • 1970-01-01
  • 1970-01-01
  • 2015-11-22
  • 1970-01-01
  • 2013-11-17
相关资源
最近更新 更多