开发者

Show random xml files in Android

In my Android app i click on the "random" button and the app shows me a random xml file out of first.xml, second.xml or third.xml. This works all fine but i wondered if there is an easier or a nicer way to implement it if you have 100+ xml files.

I found some code (which works fine) which shows random ImageViews:

    private Integer [] mImageIds = { 
        R.drawable.one, 
        R.drawable.two, 
        R.drawable.three, 
        };
   private static final Random rgenerator = new Random();

   private ImageView iv;

   .
   .
   .

   Integer q = mImageIds[rgenerator.nextInt(mImageIds.length)];

   iv = (ImageView) findViewById(R.id.imageviewyeah);
   iv.setImageResource(q);

This is how my main.xml looks:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        >
<TextView  
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="@string/hello"
    />
<Button
        android:id="@+id/first_button"
        android:onClick="change"
        android:text="first"
        android:layout_width="fill_parent"
    android:layout_height="wrap_content"
        />
<Button
        android:id="@+id/second_button"
        android:onClick="change"
 开发者_Go百科       android:text="second"
        android:layout_width="fill_parent"
    android:layout_height="wrap_content"
        />
<Button
        android:id="@+id/third_button"
        android:onClick="change"
        android:text="third"
        android:layout_width="fill_parent"
    android:layout_height="wrap_content"
        />
<Button
        android:id="@+id/random_button"
        android:onClick="change"
        android:text="random"
        android:layout_width="fill_parent"
    android:layout_height="wrap_content"
        />

and this is the code which is processed when you click on a button:

    package com.random;

    import java.util.Random;

    import android.app.Activity;
    import android.content.Intent;
    import android.os.Bundle;
    import android.view.View;

    public class Main extends Activity {
      @Override
      public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.main);
}

public void change(final View view){
    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:

        Random random = new java.util.Random();
        int rand = random.nextInt(3);

        switch (rand) {
        case 0:
            startActivity(new Intent(this, FirstPage.class));
            break;
        case 1:
            startActivity(new Intent(this, SecondPage.class));
            break;
        case 2:
            startActivity(new Intent(this, ThirdPage.class));
            break;
            }
        }
    }
}

Any help is much appreciated!


Now I've got a fairly similar question. So far i implemented a "Random"-button. If you click on it a random xml-file will be shown. Note: The content (TextViews, ImageViews) are different in the xml-files but the java code (clicking on buttons etc.) is the same!

That's the code if you click on the "Random"-button:

    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);

and this is in the 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]);
            }
    }

What i'd like to do is creating a DisplaySpecificPage.class. Above I've shown my main.class with the switch-case-clause. So when i click on the first button, it will start the FirstPage.class, clicking the second, it will start SecondPage.class, and so on. So for each xml-file i have to create a new java-class although the different java-classes do all the same. Only the xml-files are different. So i'd like to put something like this:

pseudo-code:

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

how do i pass the ID from the layout (R.layout.first_page) on?


If your classes all do the same thing except have a different layout called, you could create a single display class

public class DisplayPage extends Activity 

and send it the id of the layout in the intent extras.

You can get the id by doing something like

Class c = Class.forName("com.random.R$layout");
Integer iLayout = new Integer(c.getField("layout"+rand).getInt(new R.layout()));

(assuming your layouts are called layout1.xml, layout2.xml etc.)

Send it to your DisplayPage,

Intent intent = new Intent(this, DisplayPage.class);
intent.putExtra("Layout", iLayout);
startActivity(intent);

and get it back by doing something like

public void onCreate(Bundle savedInstanceState)
{
  super.onCreate(savedInstanceState);

  // default value
  int iLayout = R.id.main;

  if (savedInstanceState != null)
  {
    iLayout = savedInstanceState.getInt("Layout");
  }
  else
  {
    Bundle extras = getIntent().getExtras();
    if (extras != null)
    {
      iLayout = extras.getInt("Layout");
    }
  }

  setContentView(iLayout);

}

You'll also want to override onSaveInstanceState to include that int so that, e.g., changing the screen orientation doesn't make it forget what it was showing.


try
{
  Class c = Class.forName("com.random.R$layout");
  Field[] aFields = c.getFields();

  Random random = new Random();      
  boolean isUsableLayout = false;
  Integer iLayout = 0;

  while (!isUsableLayout)
  {
    int rand = random.nextInt(aFields.length);      
    iLayout = new Integer(c.getField(aFields[rand].getName()).getInt(new R.layout()));

    if (iLayout != R.layout.main)
    {
      isUsableLayout = true;
    }
  }

  Intent intent = new Intent(this, DisplayPage.class);
  intent.putExtra("Layout", iLayout);
  startActivity(intent);
}
catch (Exception e)
{
  e.printStackTrace();
}
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜