第三课:竞猜数字(基于AndroidStudio3.2)
继续学习事件处理,不继续新建工程,在原有工程基础上进行测试,本例主要是实现竞猜数字大小的功能。
一、添加一个按钮,竞猜数字按钮
参考以前课程,最终效果如下:
记住打开 app > res > values > strings.xml。添加一个名称为“button_jingc”并且值为“竞猜数字”的键。
二、创建一个 Activity
- 在 Project 窗口中,右键点击 app 文件夹并选择 New > Activity > Empty Activity。
- 在 Configure Activity 窗口中,为 Activity Name 输入“JingcActivity”,然后点击 Finish(保留所有其他属性设置为默认值)。
现在在此JingcActivity中添加一个Plain Text 、Button、TextView三个控件。
记住打开 app > res > values > strings.xml。
<string name="edit_jingc">guess a number</string>
<string name="button_guess">GUESS</string>
<string name="textv_message">ANS</string>
三、在主窗口通过按钮打开新Activity
记住该button的id。
<Button
android:id="@+id/jcbutton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginLeft="16dp"
android:layout_marginTop="16dp"
android:text="@string/button_jingc"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/editText" />
打开MainActivity.java文件,并在onCreate()方法中写上一下代码
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button btn1 = (Button) findViewById(R.id.jcbutton);
btn1.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v){
//Intent是一种运行时绑定(run-time binding)机制,它能在程序运行过程中连接两个不同的组件。
//在存放资源代码的文件夹下下,
Intent i = new Intent(MainActivity.this , JingcActivity.class);
//启动
startActivity(i);
}
});
}
添加向上导航,参考第二课,
<activity android:name=".JingcActivity"
android:parentActivityName=".MainActivity" >
<!-- The meta-data tag is required if you support API level 15 and lower -->
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".MainActivity" />
</activity>
测试ok
四、JingcActivity添加数字竞猜的程序
1、设置JingcActivity中Plain Text的inputType
2、竞猜数字处理代码
-
注册监听器的两种方法(View.OnClickListener)
- 使用匿名类注册监听器public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button button = (Button) findViewById(R.id.button); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //此处添加逻辑 } }); } }
-
使用接口注册监听器
public class MainActivity extends AppCompatActivity implements View.OnClickListener{ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button button = (Button) findViewById(R.id.button); button.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()){ case R.id.button: //此处添加逻辑 break; default: break; } } }
该项目的事件处理方法并不是使用匿名或内部类;并不是这些方法有什么问题,而是使JingcActivity的Listener对象为这种情况提供了一些便利。获取用户输入并将其与生成的随机数进行比较的主要逻辑将驻留在onClickMethod中。如果该方法位于匿名类或内部类中,则必须将包含EditText and TextViewbe的变量声明为Final。这只是Java关于内部类的规则之一;如果外部类上的任何变量都是Final,则可以引用任何变量。
//采用接口注册监听器
public class JingcActivity extends AppCompatActivity
implements View.OnClickListener{
//声明变量
int numberToGuess = 0;
EditText e;
TextView t;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_jingc);
/*The numberToGuess is initialized during onCreate but it was declared as a member variable and
not a local variable of onCreate. We need to reference this variable from the onClick method;
that’s the reason it was declared as a member variable
*/
numberToGuess = initNumberToGuess();
/*
The variable e is also initialized here but declared as a member variable as well; like
numberToGuess, we need to reference this variable from the onClick method
*/
e = (EditText) findViewById(R.id.editText2);
//Same case as in the variable t; we also need to reference this from the onClick method
t = (TextView) findViewById(R.id.textView2);
Button b = (Button) findViewById(R.id.button);
b.setOnClickListener(this);
}
@Override
public void onClick(View view) {
/*
The getText method of the EditText returns anEditable object type; it’s almost like text, but it’s
mutable, unlike a String. The Integer.parseInt, however, expects a String parameter; that’s why
we needed to convert the return value of getText using the toString method
*/
int number = Integer.parseInt(e.getText().toString());
if (number == numberToGuess) {
t.setText(number + " 猜对了!");
}
else if (number < numberToGuess) {
t.setText("猜大点");
}
else if (number > numberToGuess) {
t.setText("猜小点");
}
Log.i("Ted", numberToGuess + "");
}
int initNumberToGuess() {
//The Random class is from java.util.
Random r = new Random();
//This sets the range of the random number to be from 100 to 150
numberToGuess = r.nextInt(100) + 50;
Log.i("Ted", numberToGuess + "");
return numberToGuess;
}
}
测试运行