Показать случайные XML-файлы в Android - PullRequest
0 голосов
/ 07 мая 2011

В моем приложении для Android я нажимаю кнопку «Случайный», и приложение показывает мне случайный файл XML из first.xml, second.xml или third.xml. Это прекрасно работает, но мне было интересно, есть ли более простой или приятный способ реализовать его, если у вас более 100 XML-файлов.

Я нашел некоторый код (который отлично работает), который показывает случайные 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);

Вот так выглядит мой main.xml:

    <?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"
        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"
        />

и это код, который обрабатывается при нажатии на кнопку:

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

Любая помощь очень ценится!


Теперь у меня довольно похожий вопрос. До сих пор я реализовал кнопку «Случайная». Если щелкнуть по нему, будет показан случайный xml-файл. Примечание. Содержимое (TextViews, ImageViews) в xml-файлах отличается, но код java (нажатие кнопок и т. Д.) Одинаков!

Это код, если вы нажмете кнопку «Случайная»:

    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. Выше я показал свой main.class с условием switch-case. Поэтому, когда я нажимаю на первую кнопку, она запускает 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)?

1 Ответ

1 голос
/ 07 мая 2011

Если все ваши классы выполняют одно и то же, за исключением того, что имеют разный макет, вы можете создать один класс отображения

public class DisplayPage extends Activity 

и отправьте ему идентификатор макета в расширении намерений.

Вы можете получить идентификатор, выполнив что-то вроде

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

(при условии, что ваши макеты называются layout1.xml, layout2.xml и т. Д.)

Отправьте его на свою страницу отображения,

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

и вернуть его, выполнив что-то вроде

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

}

Вы также захотите переопределить onSaveInstanceState, чтобы включить этот int, чтобы, например, изменение ориентации экрана не заставляло его забывать, что он отображал.


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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...