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

仅显示一个java类的特定xml布局,java,android,layout,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

我以前有一个非常类似的问题,我想显示随机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);
    public class Main extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        }
public void change(final View view) {
    Intent intent2 = null;
    final Intent intent = new Intent(this, DisplaySpecificPage.class);
    switch (view.getId()) {
        case R.id.first_button:
            intent.putExtra("mylayout", R.layout.layout1);
            break;
        case R.id.second_button:
            intent.putExtra("mylayout", R.layout.layout2);
            break;
        case R.id.third_button:
            intent.putExtra("mylayout", R.layout.layout3);
            break;
        case R.id.random_button:
           intent2 = new Intent(this, DisplayRandomPage.class);
           startActivity(intent2);
        }
    // if the Random button was not clicked, if-condition is true.
    if (intent2 == null)
            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]);
        }
}
    public class DisplaySpecificPage extends Activity{
        public void onCreate(Bundle savedInstanceState) {
        final int layout = getIntent().getIntExtra("mylayout", R.layout.one);
        super.onCreate(savedInstanceState); 
        setContentView(layout);
        }
    }
    public class DisplayRandomPage extends Activity {

private Integer [] mLinearLayoutIds = { 
        R.layout.layout1,R.layout.layout2,R.layout.layout3
        };

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState); 
    Random random = new java.util.Random();
    int rand = random.nextInt(mLinearLayoutIds.length);
    setContentView(mLinearLayoutIds[rand]);
    }
}
我想做的是创建一个DisplaySpecificPage.class。上面我展示了带有switch case子句的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?

您应该将
开关
语句更改为

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);
这样,无论按下哪个按钮,您都可以启动相同的活动,并且在
DisplaySpecificPage
activity的
onCreate
方法中,您应该将内容设置为此传递的布局:

final int layout = getIntent().getIntExtra("mylayout", R.layout.one);
setContentView(layout);
当启动名为“mylayout”的
DisplaySpecificPage
活动时,上面的代码向intent传递一个额外的参数

DisplaySpecificPage
class'
onCreate
方法中,您只需使用传递的意图的
getIntExtra
方法检索此额外参数(
getIntent()
将为您返回它),您可以通过
setContentView(layout)
将此
DisplaySpecificPage
活动的内容视图设置为传递的布局

不过,您应该确保始终向该目的传递有效的布局标识符,否则在尝试充气时会出现异常(因此应正确选择
randomNumber

更新
通过向意图中添加额外内容,您可以参数化您的活动

因此,使用
intent.putExtra(“paramName”,paramValue)
可以将
paramValue
名称上的
paramValue
值传递给以此意图启动的活动

您希望启动
DisplaySpecificPage
活动,但希望它根据您单击的按钮具有不同的布局
所以你创造了一个意图:

final Intent intent = new Intent(this, DisplaySpecificPage.class);
在通过调用
startActivity(intent)
启动活动之前,您必须将此额外信息放入
intent
中,以便
DisplaySpecificPage
活动知道应将哪个布局设为其内容视图:

因此,如果按下第二个按钮,您希望新活动的布局是由
res/layout
文件夹中的
two.xml
定义的布局。它由as
R.layout.two
引用(这是一个
静态int
值)

此行将版面的值作为额外值放入
intent
对象,现在您可以启动活动了,版面引用将传递给它

“mylayout”是为参数选择的名称。它可以是任何内容(有效),将在
DisplaySpecificPage
活动中用于检索布局的引用。通过以下名称检索:

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
}
final int layout=getIntent();
如果(布局<0)
{
//TODO:未传递布局引用
}
这是我的最终代码:

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);
    public class Main extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        }
public void change(final View view) {
    Intent intent2 = null;
    final Intent intent = new Intent(this, DisplaySpecificPage.class);
    switch (view.getId()) {
        case R.id.first_button:
            intent.putExtra("mylayout", R.layout.layout1);
            break;
        case R.id.second_button:
            intent.putExtra("mylayout", R.layout.layout2);
            break;
        case R.id.third_button:
            intent.putExtra("mylayout", R.layout.layout3);
            break;
        case R.id.random_button:
           intent2 = new Intent(this, DisplayRandomPage.class);
           startActivity(intent2);
        }
    // if the Random button was not clicked, if-condition is true.
    if (intent2 == null)
            startActivity(intent);
    }
}
DisplaySpecificPage.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]);
        }
}
    public class DisplaySpecificPage extends Activity{
        public void onCreate(Bundle savedInstanceState) {
        final int layout = getIntent().getIntExtra("mylayout", R.layout.one);
        super.onCreate(savedInstanceState); 
        setContentView(layout);
        }
    }
    public class DisplayRandomPage extends Activity {

private Integer [] mLinearLayoutIds = { 
        R.layout.layout1,R.layout.layout2,R.layout.layout3
        };

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState); 
    Random random = new java.util.Random();
    int rand = random.nextInt(mLinearLayoutIds.length);
    setContentView(mLinearLayoutIds[rand]);
    }
}
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]);
        }
}
    public class DisplaySpecificPage extends Activity{
        public void onCreate(Bundle savedInstanceState) {
        final int layout = getIntent().getIntExtra("mylayout", R.layout.one);
        super.onCreate(savedInstanceState); 
        setContentView(layout);
        }
    }
    public class DisplayRandomPage extends Activity {

private Integer [] mLinearLayoutIds = { 
        R.layout.layout1,R.layout.layout2,R.layout.layout3
        };

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState); 
    Random random = new java.util.Random();
    int rand = random.nextInt(mLinearLayoutIds.length);
    setContentView(mLinearLayoutIds[rand]);
    }
}

非常感谢rekaszeru

你好,雷卡泽鲁!我只是想给出一个答案,但遗憾的是,我不能因为我是一个新用户。。。不管怎么说,你贴的东西都有用!谢谢你!我还有最后一个问题<代码>最终int布局=getIntent().getIntExtra(“mylayout”,R.layout.one)R.layout我说得对吗?一个被我按下的按钮的布局所取代。假设我按下第二个按钮,在case子句中,我放入了
intent.putExtra(“mylayout”,R.layout.two)我在那里吗?最后,我想知道“mylayout”的作用是什么?再次衷心感谢!您应该放置新活动所需的布局,而不是
R.layout.one
(因此绝对不是按钮的布局,除非您更改新活动的onCreate方法,并根据单击按钮的布局决定新布局,这会很奇怪…然后将id传递给布局引用将是更好的解决方案)。请参阅我的更新以获得更多解释。我希望您会成功:)明白了!(-有时注释不必为15个字符长;-))