Android программно добавил виды, не отображаемые в пользовательском интерфейсе - PullRequest
0 голосов
/ 02 ноября 2019

Я очень новичок в Java / Android и, возможно, пытаюсь запустить его до того, как смогу ходить, но у меня был некоторый успех, начиная с версии старой игры "Угадай код". Мой текущий камень преткновения заключается в том, что, введя мое первое предположение о коде и сгенерировав счет для этого предположения, я хочу представить новый ряд «дыр», готовых принять мое следующее предположение (первый набор дыр является статическим в моем activity_main.xml файл). У меня есть LinearLayout (вертикальная ориентация) с именем guesses для хранения рядов отверстий, и каждый ряд отверстий представляет собой LinearLayout (горизонтальная ориентация), содержащий TextView, чтобы указать, какое это число предположений, и количество ImageViews дляпустые дырки и дырки.

Я написал код, чтобы получить макет guesses в качестве родительского макета, создать новый горизонтальный LinearLayout и использовать addView, чтобы добавить его в макет guesses. Затем я переключаю свой «родительский» макет, чтобы он указывал на новый горизонтальный LinearLayout, который я только что создал, и создаю различные другие элементы TextView и ImageView и добавляю их в этот новый горизонтальный LinearLayout.

Этот код выполняется без каких-либоошибки. Я просто не вижу ни одного из моих новых макетов в интерфейсе. Что я пропустил?

Извлечение кода на данный момент:

parentLayout = (LinearLayout)findViewById(R.id.guesses);
LinearLayout guessLayout = new LinearLayout(MainActivity.this);
guessLayout.setOrientation(LinearLayout.HORIZONTAL);
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,
                        getResources().getIdentifier("@dimens/guessLayoutHeight", null, getPackageName()));
int pxMargin = (int) TypedValue.applyDimension(
                        TypedValue.COMPLEX_UNIT_DIP,
                        getResources().getIdentifier("@dimens/guessLayoutMargin", null, getPackageName()),
                        getResources().getDisplayMetrics());
layoutParams.setMargins(pxMargin, 0, pxMargin, 0);
guessLayout.setLayoutParams(layoutParams);
guessLayout.setId(guessNumber*10);
parentLayout.addView(guessLayout);

// Add the Guess# label
parentLayout = (LinearLayout)findViewById(guessNumber*10);
TextView guessLabel = new TextView(MainActivity.this);
layoutParams = new LinearLayout.LayoutParams(0, LinearLayout.LayoutParams.MATCH_PARENT, 11);
layoutParams.gravity = Gravity.CENTER_VERTICAL;
guessLabel.setText("Guess " + guessNumber);
guessLabel.setLayoutParams(layoutParams);
guessLabel.setId(guessNumber*100);
parentLayout.addView(guessLabel);

// Add the guess positions
ImageView guessPosition;
pxMargin = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 20, getResources().getDisplayMetrics());
for (int i = 1 ; i <=4 ; i++ ) {
    guessPosition = new ImageView(MainActivity.this);
    layoutParams = new LinearLayout.LayoutParams(0, LinearLayout.LayoutParams.MATCH_PARENT, 6);
    if (i == 1) {
        layoutParams.setMarginStart(pxMargin);
    } else {
        layoutParams.setMarginStart(0);
    }
    guessPosition.setLayoutParams(layoutParams);
    guessPosition.setId(guessNumber*10 + i);

    guessPosition.setImageResource(getResources().getIdentifier("@drawable/blank_guess", null, getPackageName()));
    guessPosition.setTag("blank_guess");
    guessPosition.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
    parentLayout.addView(guessPosition);
}

[Правка - следующий дополнительный вопрос можно игнорировать. Ответ получен] Этот код находится в onClickListener для моей кнопки Score. Другая вещь, которую я хочу сделать, создав новые элементы ImageView для моих дыр в догадках, - это вызвать setOnDragListener, чтобы использовать прослушиватель, который я определил во включающем onCreate методе MainActivity.java. Можно ли ссылаться на этого слушателя из кода другого слушателя? У меня есть следующее объявление на уровне класса:

ImageView guess1 = null;

... и я надеялся сделать что-то вроде

guess1 = findViewById(guessNumber*10 + 1);
guess1.setOnDragListener(MainActivity.this.guessDragListener);

, но он говорит мне, что не может решитьсимвол guessDragListener.

Ответы [ 2 ]

1 голос
/ 02 ноября 2019

Относительно вашего второго вопроса: я не уверен, что правильно понял. Хотите использовать один и тот же OnDragListener для нескольких представлений? Если так, попробуйте это:

View view = findViewById(R.id.view);
View view2 = findViewById(R.id.view2);
View.OnDragListener onDragListener;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

     onDragListener = new View.OnDragListener() {
        @Override
        public boolean onDrag(View v, DragEvent event) {
            return false;
        }
    };

    view.setOnDragListener(onDragListener);
    doStuff();
}

void doStuff(){
    view2.setOnDragListener(onDragListener);
}
0 голосов
/ 03 ноября 2019

Вы добавляете один и тот же вид 4 раза. Переменная не воссоздается, но меняет свою ссылку

for (int i = 1 ; i <=4 ; i++ )
ImageView guessPosition = new ImageView(MainActivity.this)
...

И все значение полей может быть уменьшено до

int margin = getResources().getDimens(R.dimens.name)

Это значение находится на нужных DP

...