2016-11-07 66 views
0

这个问题是关于Android的发展。一般来说,如何将布局XML文件绑定到某个Activity java文件?这与指定了android:onClick属性的按钮相关。假设你有一个类似下面的按钮布局XML文件:Android:在android中指定完整的方法路径:onClick

<Button 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="@string/button_send" 
    android:onClick="sendMessage" /> 

所以单击此按钮时,一个sendMessage(View view)方法被调用。如果多个Activity有一个sendMessage(View view)方法,Android如何决定调用哪一个?几乎没有任何关联布局文件与活动文件。在Android Studio中,如果有多个选项,我发现android:onClick="sendMessage"默认为主要活动的sendMessage方法。我还发现Android Studio不会让您只指定完整的方法路径(例如,android:onClick="com.example.Activity2.sendMessage")。我错过了什么吗?

编辑:我想补充的是Android Studio中显示的sendMessage默认为一个特定的活动,不管是哪个活动已经通过的setContentView()指定的布局

+0

Android决定调用哪个方法,因为您将setContentView(int layoutId)调用到onCreate活动方法中。 –

+0

“从字面上看,绝对没有任何关联布局文件和活动文件的情况” - “setContentView()”至少在2008年就已经出现并记录在案。其他技术也存在(例如,使用片段)。 – CommonsWare

+0

但是,当我在'android:onClick =“sendMessage”中输入'sendMessage''时,Android Studio显示一个小的弹出窗口,显示“com.example.MyApp.MainActivity”无论什么活动将特定布局设置为其内容视图 – CircuitScholar

回答

1

的会调用该方法的Activity您的布局充气并附加到。布局和控制器之间应该没有紧密的耦合,这就是为什么你不能指定“完整路径”。

我建议使用编程OnClickListener而不是xml属性。它给你更大的控制。

+0

你说应该没有紧密的耦合......当你输入'android:onClick =“......”'时,为什么Android Studio会显示一个显示完整方法路径的小弹出窗口?我主要是因为沮丧而问这个问题,因为我开始认为Android Studio只是显示不准确的信息,以致无法成为超级方便的代码编辑器。 – CircuitScholar

+0

这将是不准确的信息?不要将方法耦合到布局onClick标记只是一种最佳做法。 –

+0

这是不准确的,因为根据这里所说的,默认情况下,布局根本不受任何特定活动的约束。它被绑定到任何Activity上调用setContentView。所以Android Studio通过显示那个小的弹出窗口('com.whatever.AppName。ActivityName“),因为您在布局XML文件中输入方法名称,因为这不一定是其方法将被调用的Activity。 – CircuitScholar

0

当然,它会从该视图的活动类中调用该方法。因此,如果该视图来自主活动,并且该视图来自Activity2,则它将从主活动类调用,然后它将在Activity2中查找sendMessage方法。如果它无法在Activity2类中找到sendMessage方法,那么它将抛出一个NullpointerException。

1

有一个tools:context属性,您可以使用它来告知Android Studio在什么情况下布局将被使用。你在那里指定一个类,然后应该用这个类来找到正确的方法

但是这个属性只适用于IDE。在运行期间,它绑定到扩大布局的活动的方法。

+0

是的,这正是我的想法,但我发现tools:context属性对这个问题没有影响(Android Studio仍然声称它缺省为主活动的方法实现,无论您指定哪个Activity工具:上下文) – CircuitScholar

+0

这很奇怪。听起来像Android Studio中的一个Bug给我。正如我使用AndroidAnnotations @Click注释来做这种绑定,我现在很长一段时间没有使用onClick属性。 – Dodge

+0

我同意这可能只是一个错误,现在我已经看到了每个人的回答和评论。我讨厌臃肿的代码编辑器,所以我只会编写我的代码,并尝试忽略Android Studio的半成品装饰。 – CircuitScholar