Динамически созданный контент не будет отображаться при работе на Android 2.1 или ниже - PullRequest
0 голосов
/ 17 февраля 2011

Я новичок в разработке приложений для Android, и я пытаюсь создать экран, полный маленьких кнопок.Для этой цели я создал класс TableLayout, в котором я перезаписал метод onSizeChanged следующим кодом:

    @Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {

    super.onSizeChanged(w, h, oldw, oldh);

    if(mRows == null && mButtons == null){

        Integer height = new Integer(mActivity.getString(R.string.buttonHeight));
        Integer width = new Integer(mActivity.getString(R.string.buttonWidth));

        mColumnCount = h / height.intValue();
        mRowCount = w / width.intValue();   

        mRows = new ArrayList<TableRow>();
        mButtons = new ArrayList<Button>();
        int buttonID = 0;

        for(int i = 0; i < mColumnCount ; i++) { 

            mRows.add(new TableRow(mActivity));
            mRows.get(i).setPadding(0, 0, 0, 0);
            addView(mRows.get(i));

            for(int j = 0; j < mRowCount; j++){

                mButtons.add(new Button(mActivity)); 
                mButtons.get(buttonID).setLayoutParams(new TableRow.LayoutParams(width.intValue(), height.intValue()));
                mButtons.get(buttonID).setBackgroundResource(R.drawable.btn_normal);
                mButtons.get(buttonID).setClickable(true);
                mButtons.get(buttonID).setSelected(false);
                mButtons.get(buttonID).setPadding(0, 0, 0, 0);
                mButtons.get(buttonID).setOnClickListener(this);
                mButtons.get(buttonID).setId(buttonID);
                mRows.get(i).addView(mButtons.get(buttonID));
                buttonID++;
            }
        }
    defineBorders(); 
    }   
}

Теперь код работает нормально, когда запускается на Android 2.2 или выше, но при запуске я получаю пустой экранAndroid 2.1 или ниже.У меня нет никаких компонентов, которые требуют Android 2.2 для выполнения.На самом деле все компоненты в значительной степени относятся к API уровня 1.

Кроме того, код прекрасно работает и на 2.1, если макет создан до того, как он передан в качестве параметра в Activity.setContentView ().Но мне нужен параметр размера экрана, чтобы макет адаптировался к разным размерам экрана, и, исходя из моего понимания, я могу получить его только из метода view.onSizeChanged.

Кроме того, при поиске в стеке вызовов.он показывает следующую последовательность на Android 2.1, когда фреймворк вызывает view.onSizeChanged:

onSizeChanged (), onLayout ()

Когда последовательность на Android 2.2 имеет вид:

onSizeChanged (), onLayout (), onMeasure (), onLayout ()

Возможно, это дефект представления структуры?Или структура представления изменилась после 2.1?Какие-либо предложения относительно курса действий?

Ответы [ 2 ]

1 голос
/ 14 марта 2011

У меня была похожая проблема, и я могу предложить вам несколько решений:

  1. Переопределите onDraw () и вызовите там requestLayout () для обновления динамического содержимого
  2. (лучшее решение) Использованиеследующее:

myCustomTableLayout.post(new Runnable() {
        @Override
        public void run() {
            // Size of your table is known here
            myCustomTableLayout.addDynamicalContent(
                myCustomTableLayout.getWidth(), myCustomTableLayout.getHeight());
        }
    });

Я не пытался, но я верю, что вы можете вызвать метод post () внутри onSizeChanged ()

0 голосов
/ 17 февраля 2011

Я пропускаю причину, по которой вы не создаете свои макеты в формате xml для каждого размера / плотности экрана, который вы планируете поддерживать согласно Поддержка нескольких экранов ?Затем вы можете позволить Android обрабатывать, выбирая соответствующий макет и рисуя его правильно.

РЕДАКТИРОВАТЬ:

Не уверен, почему он не рисует должным образом на 2.1, однако я бы сделал инициализацию mRows и mButtons немного по-другому (сразу после super.onSizeChanged и перед вашим if):

if ( mRows == null ) {
    mRows = new ArrayList<TableRow>();
}
if ( mButtons == null ) {
    mButtons = new ArrayList<Button>();
}

Затем я бы удалил следующие if и сопровождающие их }:

 if(mRows == null && mButtons == null){

Моя причина сказать, что это то, что если по какой-либо причине один из mRows или mButtons не равен NULL, то ваш код рисования никогда не будет вызываться с вашим текущим оператором if,Вы явно инициализируете их нулем?

...