【问题标题】:Show specific xml layouts with only one java class仅使用一个 java 类显示特定的 xml 布局
【发布时间】:2011-05-08 12:54:30
【问题描述】:

在我想显示随机 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-class,尽管不同的 java-classes 都一样。只有 xml 文件不同。所以我想这样写:

伪代码:

    case R.id.first_button:
startActivity(new Intent(this, DisplaySpecificPage.class)) with R.layout.first_page;
break;

如何从布局 (R.layout.first_page) 传递 ID?

【问题讨论】:

    标签: java android layout


    【解决方案1】:

    您应该将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);
    

    这样,无论按下哪个按钮,您都会启动相同的活动,并且在 DisplaySpecificPage 活动的 onCreate 方法中,您应该将内容设置为这个传递的布局:

    final int layout = getIntent().getIntExtra("mylayout", R.layout.one);
    setContentView(layout);
    

    上面的代码在启动DisplaySpecificPage 活动时向意图传递了一个额外的参数,名称为:“mylayout”。

    DisplaySpecificPage 类的onCreate 方法中,您只需使用传递的意图的getIntExtra 方法检索这个额外的参数(getIntent() 将为您返回它),然后设置此@ 的内容视图987654331@ 活动到setContentView(layout) 传递的布局。

    您应该确保始终将有效的布局标识符传递给该意图,否则在尝试对其进行膨胀时会出现异常(因此应正确选择 randomNumber)。

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

    因此,使用intent.putExtra("paramName", paramValue),您会将paramName 名称上的paramValue 值传递给您以此意图启动的活动。

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

    final Intent intent = new Intent(this, DisplaySpecificPage.class);
    

    在通过调用startActivity(intent) 启动活动之前,您必须将这些额外信息放在intent 中,以便DisplaySpecificPage 活动知道它应该将哪个布局设置为其内容视图:

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

    intent.putExtra("mylayout", R.layout.two);
    

    这一行将布局的值作为附加值放入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
    }
    

    【讨论】:

    • 嗨 rekaszeru!我只是要回答,但遗憾的是不能因为我是新用户......无论如何你发布的作品!感谢那!我还有最后一个问题。 final int layout = getIntent().getIntExtra("mylayout", R.layout.one); R.layout.one 被我按下的按钮的布局所取代,我说得对吗?假设我按下第二个按钮,在 case-clause 中我输入了intent.putExtra("mylayout", R.layout.two); 我就在那儿吗?最后我想知道"mylayout" 是干什么用的?再次感谢!
    • 您应该放置您希望新活动看起来像的布局而不是 R.layout.one(所以绝对不是您的按钮布局,除非您更改新活动的 onCreate 方法,并根据点击按钮的布局,这会很奇怪......然后将id传递给布局参考将是更好的解决方案。
    • 请查看我的更新以获得更多解释。我希望你会成功:)
    • 知道了! (- 有时 cmets 不必是 15 个字符长 ;-) )
    【解决方案2】:

    这是我的最终代码:

    主类:

        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 DisplaySpecificPage extends Activity{
            public void onCreate(Bundle savedInstanceState) {
            final int layout = getIntent().getIntExtra("mylayout", R.layout.one);
            super.onCreate(savedInstanceState); 
            setContentView(layout);
            }
        }
    

    DisplayRandomPage.class:

        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!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-25
      • 2021-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多