第三课:竞猜数字(基于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;
    }
}

测试运行
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/gumufuyun/article/details/83035984