package com.iperetz1.android.testbutton1;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class TestButton extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button test2 = (Button)findViewById(R.id.test2);
test2.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
setContentView(R.layout.test2);;
}
});
Button other = (Button)findViewById(R.id.backmain);
other.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
setContentView(R.layout.main);;
}
});
}
}
main.xls
<?xml version="1.0" encoding="utf-8"?>
<AbsoluteLayout
android:id="@+id/widget0"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
xmlns:android="http://schemas.android.com/apk/res/android"
>
<Button
android:id="@+id/test2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="test2"
android:layout_x="24px"
android:layout_y="165px"
>
</Button>
</AbsoluteLayout>
test2.xml
<?xml version="1.0" encoding="utf-8"?>
<AbsoluteLayout
android:id="@+id/widget0"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
xmlns:android="http://schemas.android.com/apk/res/android"
>
<Button
android:id="@+id/backmain"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="backmain"
android:layout_x="24px"
android:layout_y="165px"
>
</Button>
</AbsoluteLayout>
答案 0 :(得分:1)
findViewById
比人们认为的要简单得多。它遍历视图层次结构,查找具有给定ID的视图。如果找不到,findViewById
将返回null。
您首先将内容视图设置为main
布局,但稍后尝试findViewById(R.id.backmain)
。由于主布局中没有该ID的视图,因此返回null。此时尝试other.setOnClickListener
将失败。只有当按钮实际存在于视图层次结构中时,才能执行此操作。
动态更改视图层次结构没有任何内在错误,但如果你走这条路线,你将不得不以不同的方式处理。 (例如,当您将事件连接到onCreate
期间不存在的视图时,就像您在上面尝试的那样。)
答案 1 :(得分:0)
正如@Cristian Castiblanco所说,动态更改视图会导致问题,对于这些场景,您必须创建单独的活动并使用意图调用它们并使用包在它们之间传递数据。