我正在构建一个Android应用程序,我正在使用以下方法来识别UI元素:
FindViewById
事情是看起来我无法访问当前打开的布局中没有的元素。
那可能吗 ?如果是这样,我如何访问不在当前加载的布局中的元素。
SetContentView (Resource.Layout.CameraLayout);
Button button1 = FindViewById<Button> (Resource.Id.firstButton);
Button button2 = FindViewById<Button> (Resource.Id.secondButton);
button1.Click += (s,e) => {//do stuff}; // In CameraLayout layout.
button2.Click += (s,e) => {//do stuff}; // Not in CameraLayout layout.
此行将抛出null异常:button2.Click += (s,e) => {//do stuff};
但如果我将其更改为:
SetContentView (Resource.Layout.AnotherLayout);
Button button1 = FindViewById<Button> (Resource.Id.firstButton);
Button button2 = FindViewById<Button> (Resource.Id.secondButton);
button1.Click += (s,e) => {//do stuff}; // Not AnotherLayout layout.
button2.Click += (s,e) => {//do stuff}; // In AnotherLayout layout.
此行将抛出null异常:button1.Click += (s,e) => {//do stuff};
所以我只能从当前加载的布局中访问元素。我非常怀疑没有办法访问其他元素,但我仍然无法找到。
答案 0 :(得分:2)
对要访问其元素的布局进行通知,然后通过FindViewById
对其进行访问,否则您只会获得在SetContentView
中设置的当前布局元素。
答案 1 :(得分:1)
每个Activity
都有自己的布局UI
,它由SetContentView()
方法中的OnCreate()
定义。
如果您想在其他布局中使用Objects (Views...)
,则需要调出这些布局,即inflate()
以获取root
布局,从这里开始,使用root
布局以访问内部元素。
View rootInAnotherLayout = this.LayoutInflater.Inflate(
Resource.Layout.AnotherLayout, // blah blah ...);
Button button1 = rootInAnotherLayout.FindViewById<Button> (Resource.Id.firstButton);
Button button2 = rootInAnotherLayout.FindViewById<Button> (Resource.Id.secondButton);
所以button1
和button1
是来自Views
而不是AnotherLayout
布局的两个this
。
答案 2 :(得分:0)
我不确定我是否理解你的问题。 但希望我的回答有所帮助。
在使用findViewById访问视图之前,必须使用@+id
在资源文件中添加视图ID。这可以按如下方式完成:
<Button android:id="@+id/firstButton android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="receiveMessage" android:text="@string/button2_text" />
然后保存文件。您将能够在您的方法中访问它。要了解更多信息,请参阅谷歌的文献
当您从XML引用任何资源对象时,需要使用at符号(@)。接下来是资源类型(在本例中为id),斜杠,然后是资源名称(edit_message)。
仅当您第一次定义资源ID时才需要资源类型之前的加号(+)。编译应用程序时,SDK工具使用ID名称在项目的gen / R.java文件中创建一个新的资源ID,该文件引用EditText元素。一旦以这种方式声明资源ID,对ID的其他引用就不需要加号。仅在指定新资源ID时才需要使用加号,而对于字符串或布局等具体资源则不需要。有关资源对象的更多信息,请参阅侧箱。
希望这有帮助。
答案 3 :(得分:0)
一般设计是您为一个布局充气并仅对该一个布局使用setContentView
。然后,您可以访问该布局中的所有可视元素。
如果当前设计强制您对多个布局进行充气,则可以考虑重新设计解决方案。
答案 4 :(得分:0)
解决方法是使用LayoutInflater
访问布局的根目录。
代码如下,其中这是一个活动:
LayoutInflater factory = (LayoutInflater)Application.Context.GetSystemService(LayoutInflaterService);
View mView = factory.Inflate(Resource.Layout.TheOtherLayout, null);
现在您可以通过以下方式获得所需的参考资料:
TextView mTextView = mView.FindViewById<TextView>(Resource.Id.textView);
ImageView mImageView = mView.FindViewById<ImageView>(Resource.Id.imageView);
//And so on....