第一个APP的知识点以及对代码的理解

APP预览

主页面效果图

首先要做的就是界面设计

activity_quiz.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:gravity="center"android:orientation="vertical"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:padding="24dp" /><LinearLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:orientation="horizontal"><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@string/true_button"/><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@string/false_button"/></LinearLayout><LinearLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@string/prev_button"/><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@string/next_button"/></LinearLayout><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="bottom|center_horizontal"android:text="@string/cheat_button"/></LinearLayout>

组件是用户界面的构造模块。组件可以显示文字或图像,与用户交互,甚至布置屏幕上的其他组件。按钮、文本输入控件和选择框等都是组件。

上图共含有如下几个组件:

一个垂直LinearLayout组件;
一个TextView组件;
三个个水平LinearLayout组件;
五个个Button组件。

创建字符串资源

字符串资源包含在一个独立的名为strings的XML文件中,需要在activity_quiz.xml文件中引用的字符串资源目前还不存在。现在我们来添加这些资源。

strings.xml
<resources><string name="app_name">GeoQuiz</string><string name="question_australia">堪培拉是澳大利亚的首都 </string><string name="true_button">TRUE</string><string name="false_button">FALSE</string><string name="prev_button">Prev</string><string name="cheat_button">Cheat!</string>
</resources>

现在,在GeoQuiz项目的任何XML文件中,只要引用到@string/false_button,应用运行时,就会得到文本“FALSE”

资源ID

要想对组件进行操作,首先要为组件生成资源ID,在activity_quiz.xml文件中,为按钮添加上android:id属性
为按钮添加资源ID(activity_quiz.xml),如:true button
 android:id="@+id/true_button"

设置完id之后就可以在QuizActivity中直接获取它们

添加成员变量(QuizActivity.java)

private Button mTrueButton;

如果出现报错可能是因为没有导入包,按Alt+Enter组合键可以自动导入所需要的包

引用组件(QuizActivity.java)

添加完成员变量后就要开始引用

mTrueButton = (Button) findViewById(R.id.true_button);

设置监听器

监听器是实现特定监听器接口的对象,用来监听某类事件的发生。
当前应用需要监听用户的按钮单击事件,因此监听器需实现View.OnClickListener接口。
mTrueButton.setOnClickListener(new View.OnClickListener(){public void onClick(View v){}});

当按钮mTrueButton被点击后,监听器会立即通知我们。传入setOnClickListener(OnClickListener)方法的参数是一个监听器。
该参数是一个实现了OnClickListener接口的对象。

创建提示消息

接下来要实现的就是,单击true按钮,弹出我们称为toast的提示消息。Android的toast是用来通知用户的简短弹出消息。
首先完善string.xml
 <string name="correct_toast">Correct!</string><string name="incorrect_toast">Incorrect!</string>

使用代码自动补全,选择makeText(Context context, int resID, int duration)方法,完成makeText方法的全部参数设置

 mTrueButton.setOnClickListener(new View.OnClickListener(){public void onClick(View v){Toast.makeText(QuizActivity.this,R.string.incorrect_toast,Toast.LENGTH_SHORT).show();}});

为了完善APP,增加题库,所有还需要为项目创建一个Question类,该类的一个实例代表一个问题,

然后再创建一个Question数组对象交由QuizActivity管理
Question.java
public class Question {private int mTextResId;private boolean mAnswerTrue;public Question(int textResId,boolean answertrue){mTextResId = textResId;mAnswerTrue = answertrue;}public int getTextResId() {return mTextResId;}public void setTextResId(int textResId) {mTextResId = textResId;}public boolean isAnswerTrue() {return mAnswerTrue;}public void setAnswerTrue(boolean answerTrue) {mAnswerTrue = answerTrue;}
}

Question类中封装的数据有两部分:问题文本和问题答案(true或false)
变量mTextResId用来保存地理知识问题字符串的资源ID。资源ID总是int类型,所以这里设置它为int而不是String类型

新增按钮以及文本视图的调整(activity_quiz.xml)

 <TextViewandroid:id="@+id/question_text_view"android:layout_width="wrap_content"android:layout_height="wrap_content"android:padding="24dp" />

<Buttonandroid:id="@+id/next_button"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@string/next_button"/>

更新字符串资源定义(strings.xml)

  <string name="next_button">Next</string>

添加问题库

<string name="question_oceans">太平洋比大西洋大</string><string name="question_mideast">苏伊士运河连接着红海和印度洋</string><string name="question_africa">尼罗河流域在埃及</string><string name="question_americas">亚马逊河是美国最长的河</string><string name="question_asia">贝加尔湖是世界上最古老最深的淡水湖</string>

下面要在QuizActivity.java文件中添加TextView和新Button变量。另外,再创建一个Question对象数组以及一个该数组的索引变量

增加按钮变量及Question对象数组(QuizActivity.java)

private Button mNextButton;
private TextView mQuestionTextView;
private Question[] mQuestionBank = new Question[]{new Question(R.string.question_australia ,true),new Question(R.string.question_oceans,true),new Question(R.string.question_mideast,false),new Question(R.string.question_africa,false),new Question(R.string.question_americas,true),new Question(R.string.question_asia,true)};private int mCurrentIndex=0;

引用TextView,并将其文本内容设置为当前数组索引所指向的地理知识问题

使用TextView(QuizActivity.java)

mQuestionTextView = (TextView) findViewById(R.id.question_text_view);
int question = mQuestionBank[mCurrentIndex].getTextResId();
mQuestionTextView.setText(question);

然后运行GeoQuiz应用。可看到数组存储的第一个问题显示在TextView上了

为Next按钮设置监听器

该监听器的作用是:递增数组索引并相应更新显示TextView的文本内容

mNextButton = (Button) findViewById(R.id.next_button);
mNextButton.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {mCurrentIndex = (mCurrentIndex + 1) % mQuestionBank.length;int question = mQuestionBank[mCurrentIndex].getTextResId();mQuestionTextView.setText(question);}
});

mCurrentIndex = (mCurrentIndex + 1) % mQuestionBank.length;这段代码表示向下切换,所以在挑战练习中增加向上切换只需要把+1改成-1即可

使用updateQuestion()封装公共代码(QuizActivity.java)

 private void updateQuestion(){int question = mQuestionBank[mCurrentIndex].getTextResId();mQuestionTextView.setText(question);}

封装代码的只要目的是减少重复代码,可以直接调用

mNextButton.setOnClickListener(new View.OnClickListener(){public void onClick(View v){mCurrentIndex = (mCurrentIndex+1) % mQuestionBank.length;updateQuestion();}});

增加方法checkAnswer(boolean)(QuizActivity.java)

private void checkAnswer(boolean userPressedTrue){boolean answerIsTrue = mQuestionBank[mCurrentIndex].isAnswerTrue();int messageResId = 0;if(mIsCheater){messageResId = R.string.judgment_toast;}else {if (userPressedTrue == answerIsTrue){messageResId = R.string.correct_toast;} else {messageResId = R.string.incorrect_toast;}}Toast.makeText(this,messageResId,Toast.LENGTH_SHORT).show();}

private void checkAnswer(boolean userPressedTrue)该方法接受boolean类型的变量参数,判别用户单击了TRUE还是FAL S E按钮。
然后,将用户的答案同当前Question对象中的答案作比较。最后,判断答案正确与否,生成一个Toast消息反馈给用户。

调用方法checkAnswer(boolean)(QuizActivity.java)

在按钮的监听器里,调用checkAnswer(boolean)方法
mTrueButton = (Button) findViewById(R.id.true_button);mTrueButton.setOnClickListener(new View.OnClickListener(){public void onClick(View v){//Toast.makeText(QuizActivity.this,R.string.incorrect_toast,Toast.LENGTH_SHORT).show();checkAnswer(true);}});

为按钮添加图标,需要在XML文件中引用资源

<Button
android:id="@+id/next_button"     android:layout_width="wrap_content"     android:layout_height="wrap_content"     android:text="@string/next_button"     android:drawableRight="@drawable/arrow_right"     android:drawablePadding="4dp" />

日志跟踪理解Activity生命周期

输出日志信息

Android的android.util.Log类能够发送日志信息到系统级别的共享日志中心。Log类有好几个日志记录方法。本书使用最多的是以下方法:public static int d(String tag, String msg),
d代表着“debug”的意思,用来表示日志信息的级别。第一个参数表示日志的来源,第二个参数表示日志的具体内容。该方法的第一个参数通常以类名为值的TAG常量传入。这样,很容易看出日志信息的来源。

新增一个TAG常量(QuizActivity.java)

private static final String TAG = "QuizActivity";

为onCreate(...)方法添加日志输出代码(QuizActivity.java)

protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);Log.d(TAG,"onCreate(Bundle)called");setContentView(R.layout.activity_quiz);

覆盖更多生命周期方法(QuizActivity.java)

@Overridepublic void onStart(){super.onStart();Log.d(TAG,"onStart() called");}@Overridepublic void onResume(){super.onResume();Log.d(TAG,"onResume() called");}@Overridepublic void onPause(){super.onPause();Log.d(TAG,"onPause() called");}@Overridepublic void onStop(){super.onStop();Log.d(TAG,"onStop() called");}@Overridepublic void onDestroy(){super.onDestroy();Log.d(TAG,"onDestroy() called");}

创建CheatActivity,实现界面跳转

一个activity启动另一个activity最简单的方式是使用以下startActivity方法:
public void startActivity(Intent intent)

基于intent的通信

intent对象是component用来与操作系统通信的一种媒介工具
在GeoQuiz应用中,intent用来告诉ActivityManager该启动哪个activity,因此可使用以下构造方法:
public Intent(Context packageContext, Class<?> cls)
传入该方法的Class类型参数告诉ActivityManager应该启动哪个activity;
Context参数告诉ActivityManager在哪里可以找到它

启动CheatActivity(QuizActivity.java)

在mCheatButton的监听器代码中,创建包含CheatActivity类的Intent实例,然后将其传入startActivity(Intent)方法
mCheatButton = (Button)findViewById(R.id.cheat_button); mCheatButton.setOnClickListener(new View.OnClickListener() {    @Override   public void onClick(View v) {        Intent i = new Intent(QuizActivity.this, CheatActivity.class); startActivity(i);    }
})            

 

转载于:https://www.cnblogs.com/mhhs/p/7525480.html

第一个APP——GeoQuiz相关推荐

  1. 读完这本书,我做了一个APP

    你听说过番茄工作法吗?番茄工作法是一种简单易行的时间管理方法,可以让你很快的进入工作状态,更高效的完成一天的任务. 番茄工作法是以不断循环的"番茄"为基础的,一次工作-休息的循环被 ...

  2. 前端有啥好用的手机模拟软件吗_隐藏应用,软件双开,一个APP就解决了

    大家好,这里是小狐狸 专注分享实用的干货 ​ 相信大家可能都有点 不想被人发现的小东西 平常保存在手机里 偶尔拿出来看两眼 如果女朋友翻看自己的手机 翻到些不想让她们看到的就尴尬了 今天给大家推荐可以 ...

  3. 怎么用Android做登录界面,利用Android怎么制作一个APP登录界面

    利用Android怎么制作一个APP登录界面 发布时间:2020-12-02 17:09:10 来源:亿速云 阅读:79 作者:Leah 这期内容当中小编将会给大家带来有关利用Android怎么制作一 ...

  4. 初学者用pycharm创建一个django项目和一个app时需要注意的事项

    目录 如何新建一个djiango项目: 如何创建一个app: 如何启动一个django项目: 新建一个django项目,需要注意以下几项配置: 如何新建一个djiango项目: 1.在pycharm中 ...

  5. mysql独立开发_独立开发一个 App 是一种怎样的体验?

    我要回答一下这样孤单的问题.哈哈哈. 我做过2个已经上线的APP. 第一个<仅仅电影>(已经下线了): 那时候年轻,想做一个独立的电影影单类的APP,推荐很多好看电影.然后想法立了就开始做 ...

  6. 【移动端debug-6】如何做一个App里的web调试小工具

    原文链接:如何做一个App里的web调试小工具 我们知道现在hybrid app非常流行,在这样的app里,h5页面是应用非常广泛的.相对于以往在pc端开发的网页,放在app里的网页由于无法直接使用桌 ...

  7. Android项目实战(二十二):启动另一个APP or 重启本APP

    Android项目实战(二十二):启动另一个APP or 重启本APP 原文:Android项目实战(二十二):启动另一个APP or 重启本APP 一.启动另一个APP 目前公司项目需求,一个主AP ...

  8. android应用程序 多少钱_关于APP开发你最想了解的事,开发一个APP多少钱?

    当我们在进行APP开发,最关注的问题一定是APP开发的价格问题,而作为软件开发行业的从业人员,经常会遇到这样的情况:"别说这么多,你只要告诉我开发一个软件多少钱就行了". 郑州AP ...

  9. Android Studio下载、安装、配置及连接真机开发第一个App ——入门选手快进

      最近的安卓测试给我心态搞蹦了,问也没人问,难受简直了!又是一轮自学之路(说实话这一路上教会我一个很大的道理就是一定要有愿意帮助你的老师,还有自己的自觉,一样也不能少.前者没有的话只能后者补了呜呜呜 ...

  10. 语言做一个自动售货机软件_软件开发手机app系统软件高端定制做一个app软件要多少钱...

    软件开发手机app系统软件高端定制-做一个app软件要多少钱 APP开发分原生APP开发和在线制作,我们来看下这两种都需要多少费用吧. 1.原生APP开发(定制开发) 互联网是个神奇的大网,大数据开发 ...

最新文章

  1. OpenSSH7.0兼容性测试报告
  2. 每日一学|数据中心spine leaf网络架构
  3. 提取DVD视频盘的资源
  4. 对 JsonConvert 的认识太肤浅了,终于还是遇到了问题
  5. mybatis环境搭建步骤(含配置文件代码)
  6. Python缩小图像
  7. Spring @Autowird
  8. 北京师范大学c语言题库,北京师范大学C语言题库.doc
  9. unity设置手机横屏方法和相关问题
  10. Python制作微信自动回复机器人,打游戏时自动回复女朋友消息
  11. Cookie--防劫持的处理
  12. 语音专题第一讲,麦克风阵列的语音信号处理技术
  13. 毕业设计-基于大数据的移动图书馆个性化推荐系统-python
  14. 【Day12-Stream流Map集合】
  15. Quick-cocos2d-x 与COCOS2DX 区别
  16. android java 指针异常处理,Android程序员日常开发中异常总结
  17. GHost++ CB (Custom Build) MOD
  18. 量化交易是不是用机器预测股票涨跌?这靠谱吗?
  19. Thinkcmf子栏目获取父级栏目所有子栏目列表
  20. 《每日一题》NO.13:名词解释 设计流程篇

热门文章

  1. QT数据可视化框架编程实战之三维曲面图 实时变化的三维曲面图 补天云QT技术培训专家
  2. 详细!详细!详细!检查百分百:服务器巡检脚本-shell
  3. 一文解读基于PaddleSeg的钢筋长度超限监控方案
  4. [mtk7621]双核四线程怎么理解
  5. altium room 布局_AD(Altium Designer)PCB布线中的“格式刷”,助力快速布局布线
  6. 火绒安全卫士安装教程(非常详细)从零基础入门到精通,看完这一篇就够了
  7. PTA-7-11 分段计算居民水费 (10 分)
  8. UE4和C++ 开发-blueprintcallable是什么
  9. PR或者AE启动不了,桌面弹出Crash文件解决办法
  10. python中size是什么意思_python如何使用numpy中的size()函数?