android开发的第一个app--GeoQuiz
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了android开发的第一个app--GeoQuiz相关的知识,希望对你有一定的参考价值。
android开发是什么
Android开发是指android平台上应用的制作,Android早期由“Android之父”之称的Andy Rubin创办,Google于2005年并购了成立仅22个月的高科技企业Android,展开了短信、手机检索、定位等业务,以Java为编程语言,使接口到功能,都有层出不穷的变化。
此时此刻的感受
第一次写博客,感觉很奇妙,想了好久,还没有思路,到底写什么呢?仍记得,初高中写作文时,假如对文题没有头绪,就会选择编个故事,把自己当作其中的主角,想其所想,悟其所悟,体会其中的冷暖寒凉,然后一篇1000字的文章就写完了。这个时候,想着想着,渐渐有所感悟。博客记录的是一个程序员进行项目开发的所思所悟,这个贵在积累,每天一点点,既是对自己的总结又能将自己的经历与网友共勉。所以现在想来,博客也并没有那么难了,因为这是为自己书写的。
GeoQuiz的项目开发历程
创建Android项目
注意:
1、选择合适的SDK版本
2、注意子类名的Activity后缀,这是种规范的命名方式
用户界面设计
1、在XML文件(activity_quiz.xml)中定义组件,为按钮添加资源ID
<?xml version="1.0" encoding="utf-8"?> <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"> <TextView android:id="@+id/question_text_view" android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="24dp" /> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal"> <Button android:id="@+id/true_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/true_button"/> <Button android:id="@+id/false_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/false_button"/> </LinearLayout> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content"> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/prev_button" android:text="@string/prev_button"/> <Button android:id="@+id/next_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/next_button"/> </LinearLayout> <Button android:id="@+id/cheat_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="bottom|center_horizontal" android:text="@string/cheat_button"/> </LinearLayout>
2、视图层级结构
LinearLayout有两个子组件:TextView、LinearLayout。
若作为子组件的LinearLayout,还自带两个button组件。
组件的俩属性:match_parent、wrap_content
从布局XML到视图对象
1、引用组件,为TRUE、FALSE按钮设置监听器、创建提示消息
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.d(TAG,"onCreate(Bundle)called"); setContentView(R.layout.activity_quiz); if(savedInstanceState !=null){ mCurrentIndex = savedInstanceState.getInt(KEY_INDEX,0); } mQuestionTextView = (TextView) findViewById(R.id.question_text_view); 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); } }); mFalseButton = (Button) findViewById(R.id.false_button); mFalseButton.setOnClickListener(new View.OnClickListener(){ public void onClick(View v){ Toast.makeText(QuizActivity.this,R.string.correct_toast,Toast.LENGTH_SHORT).show(); checkAnswer(false); } });
2、接着可以尝试运行应用,界面图用最终的啦
注意:安卓手机首次连接时,手机需要在开发者选项,找到USB调试按钮并开启,手机连接也换成传送文件,并且注意点击手机上的提示信息,正确安装app
以小见大,融会贯通,实现app功能的完善与创新
1、Android与MVC设计模式
2、activity的生命周期
3、Android应用的调试
4、第二个activity
下面分别是各项的完整代码,仅供参考
CheatActivity
package edu.niit.software.geoquiz; import android.content.Context; import android.content.Intent; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.TextView; public class CheatActivity extends AppCompatActivity { private static final String EXTRA_ANSWER_IS_TRUE="edu.niit.software.geoquiz.answer_is_true"; private static final String EXTRA_ANSWER_SHOWN = "edu.niit.software.geoquiz.answer_shown"; private boolean mAnswerIsTrue; private TextView mAnswerTextView; private Button mShowAnswerButton; public static Intent newIntent(Context packageContext , boolean answerIsTrue){ Intent intent = new Intent(packageContext,CheatActivity.class); intent.putExtra(EXTRA_ANSWER_IS_TRUE,answerIsTrue); return intent; } public static boolean wasAnswerShown(Intent result){ return result.getBooleanExtra(EXTRA_ANSWER_SHOWN,false); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_cheat); mAnswerIsTrue = getIntent().getBooleanExtra(EXTRA_ANSWER_IS_TRUE,false); mAnswerTextView = (TextView) findViewById(R.id.answer_text_view); mShowAnswerButton = (Button) findViewById(R.id.show_answer_button); mShowAnswerButton.setOnClickListener(new View.OnClickListener(){ public void onClick(View v){ if(mAnswerIsTrue){ mAnswerTextView.setText(R.string.true_button); }else { mAnswerTextView.setText(R.string.false_button); } setAnswerShownResult(true); } }); } private void setAnswerShownResult(boolean isAnswerShown){ Intent data = new Intent(); data.putExtra(EXTRA_ANSWER_SHOWN,isAnswerShown); setResult(RESULT_OK,data); } }
Question
package edu.niit.software.geoquiz; /** * Created by 666 on 2017/9/4. */ 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; } }
QuizActivity
package edu.niit.software.geoquiz; import android.app.Activity; import android.content.Intent; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.TextView; import android.widget.Toast; public class QuizActivity extends AppCompatActivity { private Button mTrueButton; private Button mFalseButton; private Button mNextButton; private Button mPrevButton; private Button mCheatButton; private TextView mQuestionTextView; private static final String TAG = "QuizActivity"; private static final String KEY_INDEX = "index"; private static final int REQUEST_CODE_CHEAT = 0; 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; private boolean mIsCheater; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.d(TAG,"onCreate(Bundle)called"); setContentView(R.layout.activity_quiz); if(savedInstanceState !=null){ mCurrentIndex = savedInstanceState.getInt(KEY_INDEX,0); } mQuestionTextView = (TextView) findViewById(R.id.question_text_view); 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); } }); mFalseButton = (Button) findViewById(R.id.false_button); mFalseButton.setOnClickListener(new View.OnClickListener(){ public void onClick(View v){ // Toast.makeText(QuizActivity.this,R.string.correct_toast,Toast.LENGTH_SHORT).show(); checkAnswer(false); } }); mNextButton = (Button) findViewById(R.id.next_button); mNextButton.setOnClickListener(new View.OnClickListener(){ public void onClick(View v){ mCurrentIndex = (mCurrentIndex+1) % mQuestionBank.length; mIsCheater = false; updateQuestion(); } }); mPrevButton = (Button) findViewById(R.id.prev_button); mPrevButton.setOnClickListener(new View.OnClickListener(){ public void onClick(View v){ mCurrentIndex = (mCurrentIndex-1) % mQuestionBank.length; updateQuestion(); } }); mCheatButton = (Button) findViewById(R.id.cheat_button); mCheatButton.setOnClickListener(new View.OnClickListener(){ public void onClick(View v){ //Intent intent = new Intent(QuizActivity.this , CheatActivity.class); boolean answerIsTrue = mQuestionBank[mCurrentIndex].isAnswerTrue(); Intent intent = CheatActivity.newIntent(QuizActivity.this,answerIsTrue); //startActivity(intent); startActivityForResult(intent,REQUEST_CODE_CHEAT); } }); updateQuestion(); } @Override public void onStart(){ super.onStart(); Log.d(TAG,"onStart() called"); } @Override public void onResume(){ super.onResume(); Log.d(TAG,"onResume() called"); } @Override public void onPause(){ super.onPause(); Log.d(TAG,"onPause() called"); } @Override public void onSaveInstanceState(Bundle savedInstanceState){ super.onSaveInstanceState(savedInstanceState); Log.i(TAG,"onSaveInstanceState"); savedInstanceState.putInt(KEY_INDEX,mCurrentIndex); } @Override public void onStop(){ super.onStop(); Log.d(TAG,"onStop() called"); } @Override public void onDestroy(){ super.onDestroy(); Log.d(TAG,"onDestroy() called"); } private void updateQuestion(){ int question = mQuestionBank[mCurrentIndex].getTextResId(); mQuestionTextView.setText(question); } 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(); } protected void onActivityResult(int requestCode , int resultCode , Intent data){ if(resultCode != Activity.RESULT_OK){ return; } if(requestCode == REQUEST_CODE_CHEAT){ if(data == null){ return; } mIsCheater = CheatActivity.wasAnswerShown(data); } } }
strings
<resources> <string name="app_name">GeoQuiz</string> <string name="question_australia">堪培拉是澳大利亚的首都 </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> <string name="true_button">TRUE</string> <string name="false_button">FALSE</string> <string name="next_button">Next</string> <string name="prev_button">Prev</string> <string name="correct_toast">Correct!</string> <string name="incorrect_toast">Incorrect!</string> <string name="warning_text">Are you sure you want to do this?</string> <string name="show_answer_button">Show Answer</string> <string name="cheat_button">Cheat!</string> <string name="judgment_toast">Cheating is wrong</string> </resources>
大体上就这么多,其中还遇到了一个麻烦,就是完成了快好的时候,被我一个不小心,全部删掉了,撤回不成,所以我又重写了一篇,如果其中有些许问题,望君海涵。
以上是关于android开发的第一个app--GeoQuiz的主要内容,如果未能解决你的问题,请参考以下文章
Hello,Android——从最基础的Android开发开始
在 Android 市场上发布我的第一个 android 应用程序
Kotlin将超越Java成为Android开发的第一语言?