-
2018-09-07 17:53:13
分享一个android端的小例子,代码虽少,五脏俱全。
得到的效果是
废话不多说,直接上代码。
我们先看项目的结构。
我们的主活动页面是activity_main.xml 代码如下
<?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <TextView android:id="@+id/question_text_view" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:padding="24dp"/> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical|center_horizontal" 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> <Button android:id="@+id/cheat_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="bottom|center" android:text="@string/cheat_button"/> <Button android:id="@+id/next_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="bottom|right" android:text="@string/next_button"/> </FrameLayout>
对应的活动页面是MainActivity.java,代码如下:
package ligz.com.geoquiz; 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 MainActivity extends AppCompatActivity { private static final String TAG = "QuizActivity"; private static final String KEY_INDEX = "index"; private Button mTrueButton; private Button mFalseButton; private Button mNextButton; private TextView mQuestionTextView; private Button mCheatButtton;//作弊的按钮 private boolean mIsCheater; private TrueFalse[] mQuestionBank = new TrueFalse[]{ new TrueFalse(R.string.question_text,true), new TrueFalse(R.string.question_text1,true), new TrueFalse(R.string.question_text2,true), new TrueFalse(R.string.question_text3,true), new TrueFalse(R.string.question_text4,false), }; private int mCurrentIndex = 0; private void updateQuestion(){ int question = mQuestionBank[mCurrentIndex].getmQuestion(); mQuestionTextView.setText(question); } private void checkAnswer(boolean userPressedTrue){ boolean answerIsTrue = mQuestionBank[mCurrentIndex].ismTrueQuestion(); 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(); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.d(TAG, "onCreate(Bundel) called"); setContentView(R.layout.activity_main); //从数组中拿出问题放入TextView mQuestionTextView = (TextView)findViewById(R.id.question_text_view); /** * 正确按钮 */ mTrueButton = (Button)findViewById(R.id.true_button); //使用监听器 mTrueButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { checkAnswer(true); } }); /** * 错误按钮 */ mFalseButton = (Button) findViewById(R.id.false_button); mFalseButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { checkAnswer(false); } }); /** * 下一道题目按钮 */ mNextButton = (Button)findViewById(R.id.next_button); mNextButton.setOnClickListener(new View.OnClickListener(){ @Override public void onClick(View view) { mCurrentIndex = (mCurrentIndex + 1) % mQuestionBank.length; mIsCheater = false; updateQuestion(); } }); if(savedInstanceState != null){ mCurrentIndex = savedInstanceState.getInt(KEY_INDEX, 0); } /** * 作弊的按钮跳转 */ mCheatButtton = (Button) findViewById(R.id.cheat_button); mCheatButtton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { //Start CheatActivity //跳转activity Intent i = new Intent(MainActivity.this, CheatActivity.class); //传递内容 boolean answerIsTrue = mQuestionBank[mCurrentIndex].ismTrueQuestion(); i.putExtra(CheatActivity.EXTRA_ANSWER_IS_TRUE, answerIsTrue); //startActivity(i); startActivityForResult(i,0);//第二个参数是请求代码,当一个activity有多个子activity时,且需要区分消息反馈 } }); updateQuestion(); } @Override public void onSaveInstanceState(Bundle savedInstanceState){//记住当前的答案,当屏幕旋转时,仍可以回到当前问题 super.onSaveInstanceState(savedInstanceState); Log.i(TAG, "onSavedInstanceState"); savedInstanceState.putInt(KEY_INDEX, mCurrentIndex); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data){// if(data == null){ return; } mIsCheater = data.getBooleanExtra(CheatActivity.EXTRA_ANSWER_SHOWN, false); } }
点击cheat按钮,进入查看答案的页面,对应的xml文件是activity_cheat.xml如下:
<?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:orientation="vertical" android:gravity="center"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="24dp" android:text="@string/warning_text"/> <TextView android:id="@+id/answerTextView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="24dp"/> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/showAnswerButton" android:text="@string/show_answer_button"/> </LinearLayout>
对应的CheatActivity.java文件如下:
package ligz.com.geoquiz; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.TextView; /** * Created by Es muss sein on 2018/9/4. */ public class CheatActivity extends Activity{ public static final String EXTRA_ANSWER_IS_TRUE = "ligz.com.geoquiz.answer_is_true"; public static final String EXTRA_ANSWER_SHOWN = "ligz.com.geoquiz.answer_show"; private boolean mAnswerIsTrue; private TextView mAnswerTextView; private Button mShowAnswer; private void setAnswerShowResult(boolean isAnswerShown){ Intent data = new Intent(); data.putExtra(EXTRA_ANSWER_SHOWN, isAnswerShown); setResult(RESULT_OK, data); } @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.answerTextView); //答案不会显示除非用户按下按钮 setAnswerShowResult(false); mShowAnswer = (Button)findViewById(R.id.showAnswerButton); mShowAnswer.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if(mAnswerIsTrue){ mAnswerTextView.setText(R.string.true_button); }else{ mAnswerTextView.setText(R.string.false_button); } setAnswerShowResult(true); } }); } }
model文件TrueFalse.java如下:
package ligz.com.geoquiz; /** * Created by Es muss sein on 2018/9/3. */ public class TrueFalse { private int mQuestion; private boolean mTrueQuestion; public TrueFalse(int mQuestion, boolean mTrueQuestion){ this.mQuestion = mQuestion; this.mTrueQuestion = mTrueQuestion; } public int getmQuestion() { return mQuestion; } public void setmQuestion(int mQuestion) { this.mQuestion = mQuestion; } public boolean ismTrueQuestion() { return mTrueQuestion; } public void setmTrueQuestion(boolean mTrueQuestion) { this.mTrueQuestion = mTrueQuestion; } }
对应Strings.xml如下:
<resources> <string name="app_name">GeoQuiz</string> <string name="question_text">中国哲学简史的作者是否是冯友兰</string> <string name="question_text1">1984的作者是乔治奥威尔吗</string> <string name="question_text2">王小波写过沉默的大多数吗</string> <string name="question_text3">意志和表象的世界是叔本华的作品吗</string> <string name="question_text4">牛棚杂忆和动物庄园的作者是同一人吗</string> <string name="cheat_button">cheat!</string> <string name="warning_text">你确定要查看答案吗</string> <string name="show_answer_button">查看答案</string> <string name="judgment_toast">Cheating is wrong</string> <string name="true_button">对</string> <string name="false_button">错</string> <string name="menu_settings">Settings</string> <string name="correct_toast">回答正确</string> <string name="incorrect_toast">回答错误</string> <string name="next_button">下一题</string> </resources>
更多相关内容 -
Android入门
2019-02-26 13:28:39Android入门 -
Xamarin.Android 入门(官网)中文文档.pdf
2019-07-03 23:37:37Xamarin.Android 入门(官网)中文文档.pdf 是微软官网上的Xamarin.Android 中文文档,希望对大家开发有帮助 -
android入门到精通.pdf
2018-04-09 14:53:31android入门到精通.pdfandroid入门到精通.pdfandroid入门到精通.pdfandroid入门到精通.pdfandroid入门到精通.pdf -
Android入门到精通详解 (带目录)
2018-04-01 10:09:52Android入门到精通详解 (带目录)...................... -
Android入门到精通详解(完整书签)
2015-04-10 16:59:40Android入门到精通详解(完整书签) -
android入门书籍经典
2016-02-29 11:21:08此书作为android入门是很不错的选择,适合对android没有基础的人士,能够全面的了解android基本知识,并能窥探其中的一些细节,做到知其然。 -
Android入门经典
2019-01-25 12:13:30Android入门经典,新手必备的经典,从0开始学Android。 -
android入门到精通
2021-08-22 15:36:10Android入门到精通学习资料,android参考手册,很好的学习资料,适合初学者 -
Android入门课程之JAVA入门
2021-06-08 18:37:32韦东山老师的Android入门视频教程,该课程主要讲解android开发所需的Java基础知识,包括Java类、封装、继承、多态、异常、泛型、反射等知识点。看完这十多节视频就能掌握Android开发所需的java知识 -
Android入门PPT
2012-07-28 08:28:17Android 是Google公司于2007年11月宣布的一种基 于 Linux® V2.6 内核的综合操作环境。最初,Android 的部署目标是移动电话领域,包括智能电话和更廉价的翻盖手机。但是, Android 全面的计算服务和丰富的功能支持... -
android 入门书籍
2014-12-17 20:44:42多个android 入门开发书籍,对于刚学习android开发的人很是有用。 -
Android入门书籍
2014-03-22 17:18:31本压缩包中总共包含了五本入门书籍,分别为:《14天学会android开发》、《android开发从入门到精通》、《android入门》、《android开发入门与实践》、《深入浅出Google_Android》 -
android入门学习.ppt
2015-11-06 15:34:44android入门学习.ppt,对于新手学习android入门有很大的帮助 -
Android入门基础教程(小白速成1)
2021-01-11 17:56:04Android 入门基础教程(小白速成1) 编译工具:Android Studio 各种工具其实大同小异 开发环境的搭建还有项目新建这里就不过多说明了,网上有很多教程。项目新建按照需求来就好,我这里选用空的界面(Empty Activity...Android 入门基础教程(小白速成1)
编译工具:Android Studio
各种工具其实大同小异
开发环境的搭建还有项目新建这里就不过多说明了,网上有很多教程。项目新建按照需求来就好,我这里选用空的界面(Empty Activity)和Android 4.0.3,大家一定要注意安卓版本匹配问题鸭,之前每次新建项目都报错,最后才发现是版本匹配问题。
话不多说,进入正题吧!Hello World!
新建好项目以后,我们首先认识几个主要用到的界面。
MainActivity.java页面,这个页面相当于我们的主视图。
res文件夹是资源文件的配置文件。
文件夹里面有 layout 用来存放布局文件。
以上就是基本用到的文件,而如果此时项目没有报错,那么直接运行便会可以显示hello world,应用已经发布到了模拟器上。
如图,我们运行成功了。模拟器和普通手机很类似,可以实现很多功能。大家可以自行尝试。开始添加组件
我们添加组件的操作是在activity_main.xml上通过拖动完成的
最左下角的design视图里,我们能通过拖动左边的组件,放在右边的界面上。Text页面是组件的代码,我们可以在text页面修改组件的参数。
而拖动后可能会报错,如下图
只需要在右侧布局中点击组件周围的加号,给它固定位置即可
点击按钮响应
我们可以向页面中拖入button,自然需要点击按钮时还有一定的响应。
这就需要在activity_main.xml里的代码页面(Text)进行修改。<Button android:id="@+id/button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="157dp" android:layout_marginLeft="157dp" android:layout_marginTop="218dp" android:text="Button" android:onClick="test" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" />
我们只是添加了一句点击响应。点击时,调用test方法
test方法是需要我们在 MainActivity.java 中自己定义的。public void test(View view){ //View 表示把点击的对象引用传进来 Toast.makeText(MainActivity.this,"点击了button",Toast.LENGTH_SHORT).show(); }
在类中添加如上方法,中间的参数分别表示绑定的对象,提示的信息和显示的时间长短。
这样,我们就可以在点击按钮以后有一个小的提示出现。点击修改组件信息
如果要实现点击按钮后,对文字内容进行修改,我们首先需要找到文字内容的位置,类似于js中,我们可以在test方法中这样写。
public void test(View view){ //View 表示把点击的对象引用传进来 TextView textView =findViewById(R.id.textView); textView.setText("内容被修改了"); Toast.makeText(MainActivity.this,"点击了button",Toast.LENGTH_SHORT).show(); }
(组件必须有id值才能被找到,所以记得看看要修改的组件id是什么,例如:android:id="@+id/textView")自定义string
在values文件下我们可以看到有strings.xml,里面可以添加定义的字符串。
<resources> <string name="app_name">My Application</string> <string name="st1">this is your word</string>> </resources>
此时我们的test方法可以更改为这样,来使显示的文字变成我们提前定义好的st1。
public void test(View view){ //View 表示把点击的对象引用传进来 TextView textView =findViewById(R.id.textView); textView.setText(R.string.st1); Toast.makeText(MainActivity.this,"点击了button",Toast.LENGTH_SHORT).show(); }
这么定义,主要是为了使这个字符串被多次引用时,调用、修改更为方便。
当然,string不仅可以在代码中引用,也可以在页面中引用。
android:text="@string/st1"
这一句可以使按钮的显示文字变成我们定义的string
资源国际化
在res目录下新建文件夹:values-zh-rCN
里面复制一份string.xml<resources> <string name="app_name">我的应用</string> <string name="st1">这里是自定义的文字</string>> </resources>
虽然资源没有发生改变,但是实际运行却发现里面的文字变成了中文。
而我们可以在模拟器的设置应用中找到语言切换(其实就是手机中切换显示语言的操作)。DDMS的应用
DDMS是Dalvik调试监控服务,可以实现很多有用的功能:例如监控后台日志、系统线程、虚拟机状态、堆信息、模拟发短信、打电话……
能够把模拟器运行的信息显示出来,方便我们调试程序。
如果我们在test方法里,添加一句System.out.println("hhhhhhhhhhh")
那么点击按钮后就能看到在后台
其实我们正常打印信息是选择使用log函数Log.d("init","Debug级别运行"); Log.i("execute","info级别运行了");
运行如下图所示
当然,那六个打印优先级是依次递减的,verbose所有都会显示,而assert所有的都不会显示。模拟器好玩的东西
右边的工具栏都是可以用的,而最底下那三个点,点击以后会进入Extended Control界面,在这里我们可以控制给自己发短信,打电话。
这个界面还有很多好玩的东西,就需要大家自己寻找啦!项目打包
我们安装一个写好的程序是需要.apk文件的,我们可以点击build->build bundle(s)/apk(s)->bulid apk(s)
生成,
然后就能在项目里找到apk文件。
而这样产生的apk不够安全,有可能被同名的软件覆盖掉。
所以我们就需要使用签名。apk设置签名
为了安全起见
我们一般要导出签名的应用- build->generate signed bundle or apk
- 然后选择第二个:选择APK
- 创建一个新的密钥
- 配置密钥信息
- 选择release,勾选v2-apk签名
- 项目的release下便会有我们需要的apk文件
反编译小谈
我们的apk文件实际上是一个压缩包,解压后可以看到我们项目经过处理后的文件。
其中classes.dex和resources.arsc文件是之前文件内容的集中和r类的集中。
而反编译就是将这两个文件重新转化为之前文件的过程。反编译使用的软件:dex2jar和JD-GUI
将需要反编译的文件拖进dex2jar的目录下,用cmd命令在目录下执行 dex2jar.bat 文件名(例如:dex2jar.bat classes.dex)
然后会生成一个jar包用jd—gui.exe打开生成的jar包,我们就能看到可读的信息,也可以进行导出等操作。
看到这里啦!制作不易,请点个赞再走吧!!!
-
Android入门介绍PPT与源码.zip
2022-05-13 16:33:58Android入门介绍PPT与源码.zip -
Android入门之C++视频培训教程
2021-06-08 18:37:39Android驱动视频的语言部分,定位是、高效,学完这十多节视频就能掌握Android开发所需的c++知识,C++入门知识视频教程,涵盖C++入门所需的所有知识点。 -
深入浅出android入门开发入门教程.rar
2021-10-21 09:26:49深入浅出android入门开发入门教程 -
android入门
2012-12-20 18:55:16android入门数独等游戏 -
Android入门实战——做一个健康饮食搭配APP
2021-08-10 20:20:13六、源码下载 点击右侧链接,即可下载源码:健康饮食搭配APP 还可以关注我的公众号,后台回复:饮食搭配 这有你错过的精彩内容 ❤️Android入门实战——历史上的今天❤️ ❤️Android Stduio实现一个天气预报APP❤...一、项目概述
本次项目主要实现了一款实用的饮食搭配系统,有欢迎界面、引导界面和使用界面,其中引导界面只会在第一次使用app时候出现,符合用户使用习惯。使用界面有三个选项卡:食物搭配表、食物营养表、关于本软件。
- 【食物搭配表】是以列表形式显示食物的信息,点击进去可以查看详情,可以进行搜索和刷新;
- 【食物营养表】是以网格列表展示食物的信息,点进去也可以查看食物的详情;
- 【关于本软件】是有关软件的开发信息,包括版本号、联系电话、公司地址等,最上层有轮播图,还可以分享软件。
二、开发环境
三、项目结构
-
bean包里面是食物的工具类,FoodUtils里面是食物的数据,FoodBean里面是食物的各个属性的get和set方法以及构造方法。
-
food_grid包是网格列表,FoodGridActivity是显示网格列表的主活动,FoodGridAdapter是适配器,用来让FoodGridActivity显示Utils里面的数据,FoodDescActivity就是食物的详情活动。
-
food_list包是条目列表,InfoListActivity是列表活动,InfoListAdapter是适配器,用来让InfoListActivity显示食物数据。
-
guide包是引导包,里面GuideActivity显示引导界面,GuideAdapter是适配器,负责让GuideActivity显示三个可以滑动的界面。MainActivity就是整个项目的主文件,默认显示菜单界面。
-
AboutActivity和AboutAdapter一起组成关于界面,形成轮播图效果。
-
HomeMenuActivity就是应用默认显示的主菜单界面。
四、项目演示
1、启动模拟器运行项目,进入应用的【欢迎】界面,右上角会显示倒计时五秒钟,这是参考现在很多app的广告欢迎界面
2、倒计时结束后,进入【引导】界面,这个界面只会在第一次打开应用时候出现,以后都不会出现,这样的设计就很人性化。
3、在【引导】界面中,下面有三个页号,默认白色显示,当前显示的页面对应的页号会变红,三张页面可以手动拖动,比如现在拖动到第二页,页号2就显示红色。
4、当拖到最后一页时候,会弹出【立即进入】按钮,点击就会进入应用了
5、进入应用后会进入主界面,主界面有三个选项卡:【食物搭配表】、【食物营养表】、【关于本软件】,一起来看看吧。
6、进入【食物搭配表】界面,可以看到有各种食物的列表,类似我们之前讲过的购物商城界面,最上面是搜索框,右边是一个搜索按钮和一个刷新按钮。
7、输入“猪”,然后点击【搜索】按钮,出现关键字搜索结果
8、当你删除输入内容后,点【搜索】按钮,会弹出提示信息
9、点击【刷新】按钮,搜索框清空,列表又重新显示出来了
10、点击任一食品,这里我们点击鸡蛋,跳转到【食品详情】页面,上面有食品介绍、不能同食的食品,点击【返回】按钮可以返回上一界面。
11、选择【事物营养表】,会进入网格图界面,这里也可以选择任一食品查看详情
12、我们选择“羊肉”,进入详情页面,然后点【返回】按钮返回
13、我们进入最后一个选项卡【关于本软件】,映入眼帘的就是轮播图,一共五张,每隔5秒切换一次,循环播放,当前显示的图下面的点会变红,也可以自己手动滑动
14、点击分享软件,会弹出分享应用选择
五、项目总结
这次的饮食搭配APP是非常好的基础入门项目,涉及到很多控件和布局,还有页面跳转、适配器和列表,里面的代码逻辑也很有技巧,值得反复揣摩,方便以后开发APP。和学习一门语言一样,Android也是要多敲多练,自然而然就会了,坚持就会有收获。
六、源码下载
点击右侧链接,即可下载源码:👉健康饮食搭配APP👈
🍉还可以关注我的公众号,🍍后台回复:饮食搭配
🚀这有你错过的精彩内容
也许某天你一定会认同这句话:有的人因为太重要,便选择做朋友,因为朋友永远比恋人走的远。
-
ANDROID从入门到精通
2017-11-09 12:20:17孙更新、邵长恒和宾晟等编著的《Android从入门到精通》注重实际动手能力的培养,在遵循技术研发知识体系的严密性的同时,在容易产生错误、不易理解的环节配上翔实的开发实例呈现给读者。每一个实例都经过精心挑选,... -
android入门教程.ppt
2012-05-31 14:21:32这是个android入门教程即使你之前没接触过Android相信多练习里面的例子,举一反三让你更加了解Android 开发的基础。 -
Android入门教程及参考手册CHM
2017-02-23 11:23:17Android开发者网站教程集合,快速入门及扫盲专用 -
Android开发入门资料之基础宝典
2019-07-23 09:03:53教程名称: Android开发入门资料之基础宝典【】Android中文帮助文档【】Android新手入门 FAQ【】Android系统原理与开发要点详解【技术文档】【】android系统简介【】Linux开发Android系统基础知识大汇总【】... -
android入门学习资料
2015-07-24 17:48:30android入门学习资料,从网上搜集整理的,日语系统下压缩的,文件名可能会乱码 -
Android Studio入门到精通资料.txt
2021-02-04 12:50:49Android Studio入门到精通资料.txt