0

我对 Java/Android 很陌生,可能会在我能走路之前尝试跑步,但我从旧的“Mastermind”代码猜谜游戏的版本开始取得了一些成功。我目前的绊脚石是,在输入了我对代码的第一个猜测并生成了这个猜测的分数后,我想呈现一排新的“洞”准备接受我的下一个猜测(第一组洞在我的activity_main.xml文件中是静态的)。我有一个称为LinearLayout(垂直方向)guesses来保存孔的行,并且每一行孔都是一个包含TextView的LinearLayout(水平方向),以指示这是哪个猜测数字,以及空猜测孔的多个ImageView和得分孔。

我编写了代码以将guessesLayout 作为父布局,创建一个新的水平 LinearLayout 并将addView其添加到guesses布局中。然后,我切换我的“父”布局以指向我刚刚创建的新水平 LinearLayout,并创建各种其他 TextView 和 ImageView 项目并将它们添加到这个新的水平 LinearLayout。

此代码全部运行没有任何错误。我只是在 UI 中看不到我的任何新布局。我错过了什么?

到目前为止的代码摘录:

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

[编辑-可以忽略以下附加问题。已回答] 此代码位于我的Score按钮的 onClickListener 中。我想做的另一件事是,为我的猜测漏洞创建了新的 ImageView 项目,调用以setOnDragListener使用我在. 是否可以从另一个侦听器的代码中引用此侦听器?我在类级别有以下声明:onCreateMainActivity.java

ImageView guess1 = null;

...而我希望做的是

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

但它告诉我它无法解析符号guessDragListener

4

2 回答 2

1

关于你的第二个问题:我不确定我是否理解正确。您想对多个视图使用相同的 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);
}
于 2019-11-02T17:57:31.227 回答
0

您正在添加相同的视图 4 次。该变量未重新创建,但正在更改其引用

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

并且利润的整个事情可以减少到

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

该值在所需的 DP 上

于 2019-11-02T21:06:26.330 回答