Показать конкретные макеты XML только с одним классом Java - PullRequest
0 голосов
/ 08 мая 2011

У меня была очень похожая проблема, когда я хотел показывать случайные макеты XML.Я сделал это - с большой помощью Бена Уильямса - с классом 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.Выше я показал свой 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)?

Ответы [ 2 ]

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

Вы должны изменить ваше заявление 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);

Таким образом, вы начнете одно и то же действие независимо от того, какая кнопка будет нажата, и в методе onCreate действия DisplaySpecificPage вы должны установить содержимое для этого переданного макета:

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

Приведенный выше код передает дополнительный параметр в намерение при запуске действия DisplaySpecificPage с именем: "mylayout".

Внутри метода DisplaySpecificPage class 'onCreate вы просто извлекаете этот дополнительный параметр, используя метод getIntExtra переданного намерения (getIntent() вернет его вам), и вы задаете представление содержимого этого DisplaySpecificPage активность переданного макета по setContentView(layout).

Вы должны убедиться, что всегда передаете действительный идентификатор макета для этого намерения, в противном случае вы получите исключение при попытке его раздувать (поэтому randomNumber должен быть выбран правильно).

Обновление
Добавив дополнения в Intent, вы можете параметризовать свои действия.

Таким образом, используя intent.putExtra("paramName", paramValue), вы передадите значение paramValue для имени paramName действию, которое вы начнете этим намерением.

Вы хотите начать действие DisplaySpecificPage, но хотите, чтобы оно имело другой макет в зависимости от того, на какую кнопку вы нажимаете.
Итак, вы создаете намерение:

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

Прежде чем начинать действие с вызова startActivity(intent), вы должны поместить эту дополнительную информацию в intent, чтобы действие DisplaySpecificPage узнало, какой макет следует установить в качестве представления содержимого:

Таким образом, если вы нажали вторую кнопку, вы хотите, чтобы макет вашего нового занятия был таким, как определено two.xml внутри вашей папки res/layout. На него ссылаются как R.layout.two (что является значением static int).

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

Эта строка помещает значение макета в качестве дополнительного в объект intent, и теперь вы можете начать действие, ссылка на макет будет передана ему.

«mylayout» - это имя, которое вы выбираете для своего параметра. Это может быть что угодно (допустимо), оно будет использоваться внутри действия DisplaySpecificPage для получения ссылки на макет. Получается под этим именем:

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

Метод getIntExtra получает целочисленное значение из intent, имеющего имя «mylayout», и если он не найден, он возвращает R.layout.one.

Если вы хотите обработать этот случай (когда не задан параметр с именем mylayout), вы можете написать

final int layout = getIntent().getIntExtra("mylayout", -1);
if (layout < 0) 
{
    //TODO: no layout reference was passed
}
0 голосов
/ 09 мая 2011

Вот мой последний код:

Main.class:

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

Большое спасибо рекассеру!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...