FindViewById采用不同的布局

时间:2013-12-31 04:28:37

标签: c# android

我正在构建一个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};

所以我只能从当前加载的布局中访问元素。我非常怀疑没有办法访问其他元素,但我仍然无法找到。

5 个答案:

答案 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);

所以button1button1是来自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....