Программный подход к методу ViewSwitcher.ViewFactory makeView ()

1

Я пытался создать простой класс, который реализует интерфейс ViewSwitcher.ViewFactory на основе проекта, разработанного в "Sams Teach Yourself для разработки приложений Android за 24 часа". В примере метод makeView() раздувает макет, чтобы получить представление. Тем не менее, я хотел сделать это программно, и это не сработало.

Метод onCreate() операции выглядит следующим образом:

private TextSwitcher mQuestionText;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.game);

    mQuestionText = (TextSwitcher) findViewById(R.id.MyTextSwitcher);
    mQuestionText.setFactory(new MyTextSwitcherFactory());
    mQuestionText.setCurrentText("blablabla");
}

Предлагаемое решение выглядит следующим образом:

private class MyTextSwitcherFactory implements ViewSwitcher.ViewFactory {
    public View makeView() {
        TextView textView = (TextView) LayoutInflater.from(
        getApplicationContext()).inflate(
        R.layout.text_switcher_view,
        mQuestionText, false);
        return textView;
    }
}

Файл ресурса:

<?xml version="1.0" encoding="utf-8"?>
<TextView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:textColor="@color/title_color"
    android:textSize="@dimen/game_question_size"
    android:gravity="center"
    android:text="Testing String"
    android:layout_height="match_parent"
    android:padding="10dp">
</TextView>

Хотя я хотел так:

private class MyImageSwitcherFactory implements ViewSwitcher.ViewFactory {
    public View makeView() {
        TextView textView = new TextView(getApplicationContext());
        textView.setLayoutParams(new TextSwitcher.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
        textView.setTextColor(R.color.title_color);
        textView.setTextSize(R.dimen.game_question_size);
        textView.setGravity(Gravity.CENTER);
        textView.setText("Test");
            return textView;
    }
}

Я получаю текст "blablabla", отображаемый при использовании метода надувания, но не делая его программным путем. Не могли бы вы указать на ошибку в моем коде, пожалуйста?

Теги:

2 ответа

0
Лучший ответ

Я узнал, что не так с кодом, который я предоставил. Это неверно, поскольку он дает идентификатор ресурса в качестве параметра функции вместо самого значения.

textView.setTextColor(R.color.title_color);
textView.setTextSize(R.dimen.game_question_size);

Это верно:

textView.setTextColor(getApplicationContext().getResources().getColor(R.color.title_color));
textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, getApplicationContext().getResources().getDimension(R.dimen.game_question_size));
2
mQuestionText = (TextSwitcher) findViewById(R.id.MyTextSwitcher);

Вы находите представление по id MyTextSwitcher. Убедитесь, что вы установили этот идентификатор, если вы создаете представление программно.

view.setId(R.id.MyTextSwitcher);

Обновить:

Упс, недостаточно читал ваш код. Вы правы, так как вы раздуваете XML, ваш идентификатор должен быть установлен правильно. То, что вы, вероятно, отсутствуете, фактически добавляет представление в иерархию представлений. Вам нужно найти родительскую ViewGroup (например, LinearLayout или RelativeLayout , etc.) under which you want to put MyTextSwitcher , let call it root 'и добавьте его с чем-то вроде:

root.addView(view);
  • 0
    Это не помогло. Член mQuestionText инициализируется должным образом с идентификатором R.id.MyTextSwitcher и, если я правильно понимаю, фабрикой предоставляется два TextView. Я не понимаю, почему я должен затем установить идентификатор предоставленных TextViews в makeView() на тот же идентификатор, который имеет TextSwitcher. Я посмотрел в отладчик, и TextView с 'blablabla' является дочерним представлением TextSwitcher, поэтому инициализация, кажется, работает нормально (даже без setID() ). Тем не менее, он все еще не отображается.
  • 0
    Обновлено с немного больше, что вам нужно сделать.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню