【问题标题】:Android: actions after I click a buttonAndroid:单击按钮后的操作
【发布时间】:2017-03-26 07:48:02
【问题描述】:

作为练习,我正在编写一种 tictactoe Android 应用程序,它显示 9 个“下方”按钮,其中包含 9 个随机数。用户必须单击按钮并找到对。 当我正在调整我在网上找到的 tictactoe 示例时,我有一个 MainActivity 以这种方式调用 ImageButtonAdapter:

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

}



//Shows the About Game screen
public void showAboutGame(View v)
{
    setContentView(R.layout.about_game);
}

public void showGame(View v)
{
    setContentView(R.layout.gameplay);
    GridView gv = (GridView)findViewById(R.id.gridView);
    ImageButtonAdapter iba = new ImageButtonAdapter(this);
    gv.setAdapter(iba);
}

ImageButtonAdapter 为每个按钮设置一个 onClickListener

for(int i=0;i<buttons.length;i++){
        if(buttons[i]==null) buttons[i] = new ImageButton(c);
        buttons[i].setOnClickListener(new ButtonOnClickListener(c, buttonValueSet.get(i), i, this));
    }

ButtonOnClickListener 将值图像设置为单击的按钮,我尝试发送对 ImageButtonAdapter (this) 的引用,以便在适配器上使用 checkHit() 方法:

public class ButtonOnClickListener implements View.OnClickListener {
int value;
int index;
ImageButtonAdapter adapter;
int foundPairs;
int previousValue;
boolean firstClick = true;
int firstNumber;
private Context context;

//Constructor
public ButtonOnClickListener(int value, int index, ImageButtonAdapter adapter) {
    this.value = value;
    this.index = index;
    this.adapter = adapter;
}

@Override
public void onClick(View v) {
    ImageButton btn = (ImageButton) v;
    switch (value) {
        case 1:
            btn.setBackgroundResource(R.drawable.n_1);
            break;
        case 2:
            btn.setBackgroundResource(R.drawable.n_2);
            break;
        case 3:
            btn.setBackgroundResource(R.drawable.n_3);
            break;
        case 4:
            btn.setBackgroundResource(R.drawable.n_4);
            break;
        case 5:
            btn.setBackgroundResource(R.drawable.n_5);
            break;
        case 6:
            btn.setBackgroundResource(R.drawable.n_6);
            break;
        case 7:
            btn.setBackgroundResource(R.drawable.n_7);
            break;
        case 8:
            btn.setBackgroundResource(R.drawable.n_8);
            break;
        case 9:
            btn.setBackgroundResource(R.drawable.n_9);
            break;
        default:
            btn.setBackgroundResource(R.drawable.n_0);
    }
    adapter.checkHit(value);
}

}

这是一个简单的 checkHit():

public void checkHit(int value){
    if(firstHit == true){
        previousValue = value;
        firstHit = false;
    } else if(value == previousValue){
        Toast.makeText(c, "You hit a pair!", Toast.LENGTH_SHORT).show();
    } else  {
        Toast.makeText(c, "This is not a pair!", Toast.LENGTH_SHORT).show();
    }
}

所有这些都有效。 我的问题是,在我检查用户是否找到一对数字之后,我需要“关闭”所有与开始图像不成对的按钮。为此,我尝试以这种方式更改 checkHit():

public void checkHit(int value){
    if(firstHit == true){
        previousValue = value;
        firstHit = false;
    } else if(value == previousValue){
        Toast.makeText(c, "You hit a pair!", Toast.LENGTH_SHORT).show();
        closeAllAvailableButtons();
    } else  {
        Toast.makeText(c, "This is not a pair!", Toast.LENGTH_SHORT).show();
        closeAllAvailableButtons();
    }
}

这不起作用。这是因为声明

btn.setBackgroundResource(R.drawable.n_1);

仅在执行了adapter.checkHit(value) 之后才执行侦听器的开头。简而言之,程序在单击和分配与按钮值对应的图像之间刷新按钮。 结果是单击,带有单击的声音,但按钮图像不变。 我认为我的问题是,在单击按钮后,我不清楚如何回到游戏的流程中。 我认为我可以使用一个意图,但 ImageButtonAdapter 不是一个活动,因此据我所知,它不能被一个意图调用。 谁能帮我? 提前感谢您的耐心等待。

【问题讨论】:

    标签: android adapter onclicklistener


    【解决方案1】:

    由于这个问题相当主观然后很常见,我建议您创建 CustomViews 以避免弄乱状态。因此,您可以创建一个自定义 ImageView,其中将包含一些额外的字段,然后当您需要关闭所有这些字段但两个实时“打开”时,您只需调用如下内容:

    for (int i=0; i<parent.getChildCount(); i++ {
       imageView = (CustomImageView) parent.getChildAt(i);
       if //your customImageView not one of pair
          imageView.customMethodClose(); //may be even with some animations
       else {
          imageView.customMethodToHighLighYouPair();
       }
    }
    

    这是可以做到的。通过这种方式,您将避免考虑状态的许多错误。

    【讨论】:

      猜你喜欢
      • 2013-01-02
      • 2022-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-09
      • 2012-01-12
      • 1970-01-01
      相关资源
      最近更新 更多