我之前遇到过一个非常类似的问题,我想显示随机 xml 布局。在 Ben Williams 的大力帮助下,我已经通过一个名为 DisplayRandomPage.class 的类做到了这一点,并且我有一个带有四个按钮的 main.xml 布局。
这是Main.class的代码:
switch (view.getId()) {
case R.id.first_button:
startActivity(new Intent(this, FirstPage.class));
break;
case R.id.second_button:
startActivity(new Intent(this, SecondPage.class));
break;
case R.id.third_button:
startActivity(new Intent(this, ThirdPage.class));
break;
case R.id.random_button:
Intent intent = new Intent(this, DisplayRandomPage.class);
startActivity(intent);
这是在 DisplayRandomPage.class 中:
public class DisplayRandomPage extends Activity {
private Integer [] mLinearLayoutIds = {
R.layout.one
R.layout.two,
R.layout.three
};
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Random random = new java.util.Random();
int rand = random.nextInt(3);
setContentView(mLinearLayoutIds[rand]);
}
}
我想做的是创建一个 DisplaySpecificPage.class。上面我展示了带有 switch-case-clause 的 main.class。因此,当我单击第一个按钮时,它将启动 FirstPage.class,单击第二个按钮时,它将启动 SecondPage.class,依此类推。因此,对于每个 xml 文件,我必须创建一个新的 java 类,尽管不同的 java 类的作用都是相同的。只有 xml 文件不同。所以我想写这样的内容:
伪代码:
case R.id.first_button:
startActivity(new Intent(this, DisplaySpecificPage.class)) with R.layout.first_page;
break;
如何从布局 (R.layout.first_page) 传递 ID?
最佳答案
您应该将 switch
语句更改为
final Intent intent = new Intent(this, DisplaySpecificPage.class);
switch (view.getId()) {
case R.id.first_button:
intent.putExtra("mylayout", R.layout.one);
break;
case R.id.second_button:
intent.putExtra("mylayout", R.layout.two);
break;
case R.id.third_button:
intent.putExtra("mylayout", R.layout.three);
break;
case R.id.random_button:
intent.putExtra("mylayout", randomNumber);
startActivity(intent);
}
startActivity(intent);
这样,无论按下哪个按钮,您都会启动相同的 Activity ,并且在 DisplaySpecificPage
Activity 的 onCreate
方法中,您应该将内容设置为此传递的布局:
final int layout = getIntent().getIntExtra("mylayout", R.layout.one);
setContentView(layout);
上面的代码在启动 DisplaySpecificPage
Activity 时向 Intent 传递一个额外的参数,名称为:“mylayout”。
在 DisplaySpecificPage
类的 onCreate
方法中,您只需使用传递 Intent 的 getIntExtra
方法 (getIntent ()
将为您返回它),然后您通过 setContentView(layout)
将这个 DisplaySpecificPage
Activity 的内容 View 设置为传递的布局。
不过,您应该确保始终将有效的布局标识符传递给该 Intent ,否则在尝试膨胀它时会出现异常(因此应正确选择randomNumber
)。
更新
通过向 Intent 添加额外内容,您可以参数化您的 Activity 。
因此,使用 intent.putExtra("paramName", paramValue)
您将把 paramName
名称上的 paramValue
值传递给您以此 Intent 开始的 Activity 。
您想要启动 DisplaySpecificPage
Activity ,但希望它根据您单击的按钮具有不同的布局。
所以你创建了一个 Intent :
final Intent intent = new Intent(this, DisplaySpecificPage.class);
在通过调用 startActivity(intent)
启动 Activity 之前,您必须将此额外信息放入 intent
中,因此 DisplaySpecificPage
Activity 了解应将哪个布局设置为其内容 View :
因此,如果您按下第二个按钮,您希望新 Activity 的布局是由 res/layout
文件夹内的 two.xml
定义的布局。它被作为R.layout.two
(这是一个static int
值)引用。
intent.putExtra("mylayout", R.layout.two);
这一行将布局的值作为额外的内容放入 intent
对象中,现在您可以启动 Activity ,布局引用将传递给它。
“mylayout”是您为参数选择的名称。它可以是任何内容(有效),它将在 DisplaySpecificPage
Activity 中使用以检索布局的引用。它是通过这个名称检索的:
final int layout = getIntent().getIntExtra("mylayout", R.layout.one);
getIntExtra
方法从名称为“mylayout”的intent
中获取整数值,如果没有找到,则返回R.layout.one 。
如果你想处理这种情况(当没有设置名称为 mylayout
的参数时),你可以这样写
final int layout = getIntent().getIntExtra("mylayout", -1);
if (layout < 0)
{
//TODO: no layout reference was passed
}
关于java - 仅使用一个 java 类显示特定的 xml 布局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5927549/