java - 仅使用一个 java 类显示特定的 xml 布局

标签 java android layout

我之前遇到过一个非常类似的问题,我想显示随机 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/

相关文章:

java - Java 中的嵌套选项卡

java - 如何在java中的日志文件上获得彩色输出?

android - 从D向后导航时,防止破坏(或恢复状态) fragment B-导航组件

r - R 中函数plot_ly 的相同代码在项目和 RGUI 中给出不同的结果 : Error in Layout, 未使用的参数

android - 如何在 Spotify 上播放专辑中的轨道,以便之后使用 Spotify App Remote SDK for Android 播放专辑的下一首轨道?

android - 我可以使用 android app bundle 在我的服务器上生成所需的 APK 吗?

css - 导航栏中心位置

java - Rest JAX-RS异常,未找到MessageBodyWriter

java - 使用 Spring 将嵌套集合中的对象转换为 JSON

java - 从 Eclipse 运行的 RCP 应用程序运行良好,导出它会抛出 InjectionExceptions