IOS变量的property属性设置和意义总结

*近有机会对IOS的property属性进行了一个全面的了解和总结:

IOS 的@property和@synthesize帮我们轻易的生成对象的getter和setter方法来完成对对象的赋值和访问。但是如果我们如果要动态设置对象的getter和setter方法可以使用@property和@dynamic组合。对象访问方法property的属性设置非常多,诸如:atomic和nonatomic,readwrite和readonly,retain,assign和copy,strong和weak。

1.atomic 和 nonatomic

atomic是默认的属性,表示对对象的操作属于原子操作,主要是在多线程的环境下,提供多线程访问的安全。我们知道在多线程的下对对象的访问都需要先上锁访问后再解锁,保证不会同时有几个操作针对同一个对象。如果编程中不涉及到多线程,不建议使用,因为使用atomic比nonatomic更耗费系统资源。

nonatomic 表示访问器的访问不是原子操作,不支持多线程访问安全,但是访问性能高。

2.readwrite 和readonly

readwrite 是默认的属性,表示可以对对象进行读和写,会生成对象相应的setter和getter方法。

readonly 表示只允许读取对象的值,只会生成对象的getter方法。

3.retain,assign和copy

retain 表示对NSObject和及其子类对象release旧值,再retain新值,使对象的应用计数增加一。

此属性只能使用于obejective-c类型对象,而不能用于Core Foundation对象。(retain会增加对象的引用计数,而基本数据类型或者Core Foundation对象都没有引用计数,把对象添加到数组中时,引用计数将增加1)。

– (void) setOldValue: (NSString*) newValue {
if (newValue !=oldValue) {
[oldValue release];

oldValue = [newValue retain];

}

}

assign 是默认属性,只可以对基本数据类型(如CGFloat,NSInteger,Bool,int,代理对象)等使用。该方式会对对象直接赋值而不会进行retain操作。

copy 表示重新建立一个新的计数为1的对象,然后释放掉旧的值。

都知道retain是对指针的拷贝,copy是对内容的拷贝。比如:NSString 对象的地址为0x100,其内容为“string”,如果使用copy到另外一个NSString对象,则会生成另外一个地址为0x110的对象,只不过内容仍然是‘string“。如果使用retain到另外一个NSString对象,则该对象的地址仍然为0x100,只不过该对象的计数变为2.

4.strong 和 weak

在ARC的模式下,对象声明时需要加入strong和weak,方便内存的自动管理。默认情况下是strong类型。

strong 强引用,默认的属性,类似于retain,其实是一个相对的概念,就是一个引用。如果有一个强引用持有该对象,则该对象就不能被释放。默认的所有实例变量和局部变量都是strong指针。

weak 弱引用,类似于assign,弱引用除了不决定对象的存亡外,其他与强引用相同。即使一个对象被持有无数个若引用,只要没有强引用指向他,那麽其还是会被清除,它不是对象的拥有者。其值会在对象被释放后自动设置为nil。

weak指针主要用于“父-子”关系,父亲拥有一个儿子的strong指针,因此父亲是儿子的所有者;但为了阻止所有权循环,儿子需要使用weak指针指向父亲。典型例子是delegate模式,你的ViewController通过strong指针(self.view)拥有一个UITableView, UITableView的dataSource和delegate都是weak指针,指向你的ViewController。

IOS多线程实现方式

*近突然想起要提高我们开发的效率,而不是自己硬要像老牛那样勤勤恳恳的一步一步的做。

对于Xcode是我们的开发环境,ok,怎样提高我们的效率呢,当然是使我们Xcode的变得更强大了,而Xcode支持插件,这些插件帮助我们的Xcode,使它变得强大。

首先是下载一个Xcode下面的插件包管理器Package Manager,这个可以帮我们管理Xcode大部分常用的插件。我们可以看到很多插件。当然这些插件不是每个都需要用到下载下来安装。自己安装主要有这些:

CComent,类似与C的注释风格/**/快速注释其实xcode自带一大段代码注释快捷键。command+/键。选中需要注释的段落。

ClangFormat,帮助你调整成Clang风格的代码格式。

CocoaPods,名气在外,帮你管理链接需要用到的开源库,简单易用。

FuzzyAutoComplete,个人觉得非常好用,自动提醒补全你将要输入的函数,变量等。

HOStringSense,输入大文本编辑利器,帮你统计文本字数,自动帮你添加一些特殊字符的转移,换行符等。

KSImageNamed,很好,毕竟我们的应用经常需要与图片打交道,管你工程内部的图片资源,当你使用[UIImage ImageNamed:]时会显示工程中的所有图片,供你选择,帮你填充图片名字,不用自己再哈戳戳的跑到Image文件夹下面看看那个图片文件叫什么名字。

Lin,如果你的应用需要支持多国语言,这是一个利器。当你使用NSLocaLiseString时自动显示你的工程中的所有string,供你选择。

OMClorSense,我们的应用经常要跟颜色打交道吧,当你使用NSColor和UIColor时自动显示你输入的颜色,并且可以显示出颜色拾取器,根据你选择的颜色,自动改变你的代码。

SCCodeMiniMap,将你的代码缩小在编辑区的右部,你可以看到你的整个文件下的代码,可以快速跳转到你选择的代码区域,对于一个文件几大千和上万行的代码的话,还是有一定的作用,不过个人觉得还是Xcode自带的函数调转功能好用。这个东西把代码缩小的太小了,你都不知道写的什么,只是知道个大概的位置。

XAlign,帮助你排版代码,使代码更加整洁。

XcodeBoost,帮组你自己更加定制一些功能,如可以在一个代码片段内,将选中的所有相同的字符串高亮等。

等于编写代码而言,比不是所有的代码都要自己下载,自己通常参考下面的一些网站的代码:

http://code4app.com/ Code4App

https://www.cocoacontrols.com/ cocoacontrols

http://github.ibireme.com/github/list/ios/# github所有开源的Code的一个总结

http://www.google.com.hk 哈哈,google对没错就是它,靠谱些。

http://stackoverflow.com/ 牛逼的网站,google出来的问题很多都是这个上面解决的。

https://developer.apple.com/library/ios/navigation/index.html 当然不能忘了,我们的老本行,苹果的开发者文档。
当然我们也需要其他一些独立的应用来帮助我们提高开发效率了。

PhotoShop , 开发人员有时也需要自己处理一些简单的图片,会点总比不会强,当然我们也不会抢了设计师的饭碗。

ImageOption,有时我们需要缩小我们的开发包,就需要将里面的图片进行缩小,该工具可以将图片尽量不变质的缩小。

IFunBox/iTools,我们有时需要查看真机上面的应用程序中的文件。它可以。

Simpholders,如果我们需要查看我们应用在模拟器运行产生的文件的位置时,是不是很麻烦,先在程序中自己打印文件保存的路径,再自己打开文件自己去找,有了这个,一切都不需要了,它可以保存你*近打开的应用,快速跳转到该应用再mac上面的文件夹的地址。

Charles,搞个破解版的,网络调试的利器,因为我们的很多应用都是需要交互的,都会和服务器进行交互,那就必须用到网络,这个工具可以帮你分享真个网络过程,截获你的网络数据进行分析。

DiffMerge,一个轻量级的文件夹比较工具,做开发的那个没有做过code 的merge。

SQLiteManager,一个数据库的查看工具,你的应用十有八九都会再本地进行数据保存,那十有八九会用到数据库来进行保存。

TextMate/TextWranger,搞开发的十有八九需要用到一个文本编辑的工具,查看各种编码的文本。

TestFlight,一个测试的工具,个人还没有怎么使用过。不过貌似用的人还是很多,好像还能进行版本的管理。

briefs,一个快速的原型设计工具,支持IPhone,IPad,安装下来个人没怎么使用过,

http://www.invisionapp.com/ ,在线的原型设计工具。还不错。

http://www.pttrns.com/categories/17-lists ,一个设计风格的展示网站,可以看各种控件的使用风格。

IOS开发插件和工具总结

*近突然想起要提高我们开发的效率,而不是自己硬要像老牛那样勤勤恳恳的一步一步的做。

对于Xcode是我们的开发环境,ok,怎样提高我们的效率呢,当然是使我们Xcode的变得更强大了,而Xcode支持插件,这些插件帮助我们的Xcode,使它变得强大。

首先是下载一个Xcode下面的插件包管理器Package Manager,这个可以帮我们管理Xcode大部分常用的插件。我们可以看到很多插件。当然这些插件不是每个都需要用到下载下来安装。自己安装主要有这些:

CComent,类似与C的注释风格/**/快速注释其实xcode自带一大段代码注释快捷键。command+/键。选中需要注释的段落。

ClangFormat,帮助你调整成Clang风格的代码格式。

CocoaPods,名气在外,帮你管理链接需要用到的开源库,简单易用。

FuzzyAutoComplete,个人觉得非常好用,自动提醒补全你将要输入的函数,变量等。

HOStringSense,输入大文本编辑利器,帮你统计文本字数,自动帮你添加一些特殊字符的转移,换行符等。

KSImageNamed,很好,毕竟我们的应用经常需要与图片打交道,管你工程内部的图片资源,当你使用[UIImage ImageNamed:]时会显示工程中的所有图片,供你选择,帮你填充图片名字,不用自己再哈戳戳的跑到Image文件夹下面看看那个图片文件叫什么名字。

Lin,如果你的应用需要支持多国语言,这是一个利器。当你使用NSLocaLiseString时自动显示你的工程中的所有string,供你选择。

OMClorSense,我们的应用经常要跟颜色打交道吧,当你使用NSColor和UIColor时自动显示你输入的颜色,并且可以显示出颜色拾取器,根据你选择的颜色,自动改变你的代码。

SCCodeMiniMap,将你的代码缩小在编辑区的右部,你可以看到你的整个文件下的代码,可以快速跳转到你选择的代码区域,对于一个文件几大千和上万行的代码的话,还是有一定的作用,不过个人觉得还是Xcode自带的函数调转功能好用。这个东西把代码缩小的太小了,你都不知道写的什么,只是知道个大概的位置。

XAlign,帮助你排版代码,使代码更加整洁。

XcodeBoost,帮组你自己更加定制一些功能,如可以在一个代码片段内,将选中的所有相同的字符串高亮等。

等于编写代码而言,比不是所有的代码都要自己下载,自己通常参考下面的一些网站的代码:

http://code4app.com/ Code4App

https://www.cocoacontrols.com/ cocoacontrols

http://github.ibireme.com/github/list/ios/# github所有开源的Code的一个总结

http://www.google.com.hk 哈哈,google对没错就是它,靠谱些。

http://stackoverflow.com/ 牛逼的网站,google出来的问题很多都是这个上面解决的。

https://developer.apple.com/library/ios/navigation/index.html 当然不能忘了,我们的老本行,苹果的开发者文档。
当然我们也需要其他一些独立的应用来帮助我们提高开发效率了。

PhotoShop , 开发人员有时也需要自己处理一些简单的图片,会点总比不会强,当然我们也不会抢了设计师的饭碗。

ImageOption,有时我们需要缩小我们的开发包,就需要将里面的图片进行缩小,该工具可以将图片尽量不变质的缩小。

IFunBox/iTools,我们有时需要查看真机上面的应用程序中的文件。它可以。

Simpholders,如果我们需要查看我们应用在模拟器运行产生的文件的位置时,是不是很麻烦,先在程序中自己打印文件保存的路径,再自己打开文件自己去找,有了这个,一切都不需要了,它可以保存你*近打开的应用,快速跳转到该应用再mac上面的文件夹的地址。

Charles,搞个破解版的,网络调试的利器,因为我们的很多应用都是需要交互的,都会和服务器进行交互,那就必须用到网络,这个工具可以帮你分享真个网络过程,截获你的网络数据进行分析。

DiffMerge,一个轻量级的文件夹比较工具,做开发的那个没有做过code 的merge。

SQLiteManager,一个数据库的查看工具,你的应用十有八九都会再本地进行数据保存,那十有八九会用到数据库来进行保存。

TextMate/TextWranger,搞开发的十有八九需要用到一个文本编辑的工具,查看各种编码的文本。

TestFlight,一个测试的工具,个人还没有怎么使用过。不过貌似用的人还是很多,好像还能进行版本的管理。

briefs,一个快速的原型设计工具,支持IPhone,IPad,安装下来个人没怎么使用过,

http://www.invisionapp.com/ ,在线的原型设计工具。还不错。

http://www.pttrns.com/categories/17-lists ,一个设计风格的展示网站,可以看各种控件的使用风格。

iOS越狱插件编写 – 支付宝自动咻咻 (一)

1.安装iOSOpenDev。 安装自行google

2.打开xcode,新建项目,选择iOSOpenDev的模板,这里做一个支付宝的咻咻插件,选择CaptainHook。

3.更改项目中plist的app过滤设置

<dict>
<key>Filter</key>
<dict>
<key>Bundles</key>
<array>
<string>com.alipay.iphoneclient</string>
</array>
</dict>
</dict>

4.打开项目中的.mm文件开始写Hook函数
所有待定的class名替换为

MYMainController

这是咻咻的页面名称

Hook这个页面的viewDidLoad函数,给它加个label用来展示插件信息。

CHOptimizedMethod0(self, void, MYMainController, viewDidLoad){
CHSuper0(MYMainController, viewDidLoad);

UILabel *indicatorLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 232, 320, 25)];
indicatorLabel.backgroundColor = [UIColor colorWithWhite:1 alpha:0.3];
indicatorLabel.textAlignment = NSTextAlignmentCenter;
indicatorLabel.textColor = [UIColor blackColor];
indicatorLabel.font = [UIFont boldSystemFontOfSize:13];
indicatorLabel.tag = kTagIndicatorLabel;

UIView *view = [(UIViewController*)self view];
[view addSubview:indicatorLabel];

}

Hook点击咻咻按钮的touchup事件,实现点击一次咻咻按钮开始自动咻咻,再点击一次暂停
CHOptimizedMethod0(self, void, MYMainController, action_xiuxiuButtonTouchUp){
CHSuper0(MYMainController, action_xiuxiuButtonTouchUp);
[AlipayTweak shared].targetVC = (UIViewController*)self;
[[AlipayTweak shared] toggleXiuXiu];
}

Hook MYPopupManager的isPerformingPopup,让插件始终运行

CHOptimizedMethod0(self, BOOL, MYPopupManager, isPerformingPopup)
{
return NO;
}

支付宝的咻咻有*小请求间隔,大概3秒左右。我们把它干掉。

CHOptimizedMethod0(self, NSDate*, MYMainSceneManager, lastTriggerDate){
return [NSDate dateWithTimeIntervalSinceNow:-30];
}
总是返回比当前时间要早30秒的时间作为上次发请求的时间

CHConstructor中

CHLoadLateClass(MYMainController); // load class (that will be “available later”)
CHLoadLateClass(MYPopupManager); // load class (that will be “available later”)
<p class=”p1″><span class=”s1″> </span><span class=”s2″>CHLoadLateClass</span><span class=”s1″>(MYMainSceneManager); </span><span class=”s3″>// load class (that will be “available later”)</span></p>
CHHook(0, MYMainController, viewDidLoad); // register hook
CHHook(0, MYMainController, action_xiuxiuButtonTouchUp); // register hook
<p class=”p1″><span class=”s1″> </span><span class=”s2″>CHHook</span><span class=”s1″>(</span><span class=”s3″>0</span><span class=”s1″>, </span><span class=”s4″>MYMainSceneManager</span><span class=”s1″>, </span><span class=”s4″>lastTriggerDate</span><span class=”s1″>); </span><span class=”s5″>// register hook</span></p>
CHHook(0, MYPopupManager, isPerformingPopup); // register hook

主类中添加timer实现自动咻咻功能,不再赘述。

5.破解支付宝9.5.1

注意:支付宝新增加了__RESTRICTED segment,需要用二进制编辑软件重命名,否则不能注入。

iOS 越狱之后无法查看private、var等文件

iOS11的系统越狱之后,用iFunBox查看手机系统的文件,发现找不到private、var等文件。难道是越了个假狱???后面经过查阅一番资料之后,原来越狱之后还需要装一个afc2的补丁。afc2全称(Apple File Conduit 2)afc2补丁是越狱后很重要的一个补丁,有了它才能访问iOS设备的系统文件,获取更高的系统权限。如果没有安装,只能访问 iOS 基础文件系统目录。

%title插图%num

通过Cydia安卓afc2补丁

一、iOS11.0 – iOS11.41的系统安装AFC2的教程

1. 启动 Cydia ,在「软件源」中点击「添加」,手动输入源:「 mrmadtw.github.io/repo/ 」,点击「添加源」,等待添加完成。

2. 在搜索中搜索“Apple File Conduit 2”,并进行安装。

二、iOS 7.1-iOS 10.3.3的系统安装AFC2的教程

安装教程:https://www.i4.cn/news_detail_1623.html

安装了AFC2补丁之后,就可以访问iOS设备的系统文件目录了。

%title插图%num

【iOS逆向】iOS越狱砸壳流程

越狱
安装Cydia Impactor
下载越狱程序(IPA文件):iOS 9.2~9.3.3从这里下载1, iOS 10~10.3.3从这里下载2 3 4
使用Cydia Impactor安装越狱程序
砸壳
iPhone砸壳准备
iPhone启动Cydia,添加frida软件源(https://build.frida.re)来安装frida
Mac砸壳准备
Mac安装frida: sudo pip install frida

Mac安装frida-ios-dump:

从Github下载工程:
sudo mkdir /opt/dump && cd /opt/dump && sudo git clone https://github.com/AloneMonkey/frida-ios-dump
安装依赖:
sudo pip install -r /opt/dump/frida-ios-dump/requirements.txt –upgrade
设置别名:
在终端输入:
vim ~/.bash_profile
在末尾新增下面一段:
alias dump.py=”/opt/dump/frida-ios-dump/dump.py”
使别名生效:
source ~/.bash_profile
Mac终端运行iproxy 2222 22

Mac新建终端运行dump.py [Display name] or dump.py [Bundle identifier],即可

查看手机上安装的app和对应的bundle id: dump.py -l

参考:

https://aberlt.github.io/2017/12/14/记砸壳工具-frida-ios-dump-的使用/
http://bbs.iosre.com/t/frida-ios-dump/11640

Cydia疑难问题修复
运行Cydia,出现错误提示:flAbsPath on /var/lib/dpkg/status failed -realpath (2 no such file or directory)
请参见:
完美解決Cydia跳出Could not open file /var/lib/dpkg/status紅字錯誤

非越狱App集成流程
准备好砸壳后的IPA包
安装好MonkeyDev5:
安装*新的theos:
sudo git clone –recursive https://github.com/theos/theos.git /opt/theos
安装ldid(如安装theos过程安装了ldid,跳过):
brew install ldid
执行MonkeyDev安装命令:
sudo /bin/sh -c “$(curl -fsSL https://raw.githubusercontent.com/AloneMonkey/MonkeyDev/master/bin/md-install)”
使用MonkeyDev模版新建Xcode工程,将IPA包拖入对应的物理文件夹下面,编译
在Mac上使用Reveal来看层级结构
使用class-dump导出IPA包的头文件
直接越狱 iOS 9.2-9.3.3 https://www.efreelife.com/post/elpt50 ↩︎

iOS10~10.3.3越狱工具Meridian https://www.i4.cn/news_detail_18056.html ↩︎

iOS 10.3.3 Jailbreak https://pangu8.com/jailbreak/10.3.3/#DoubleH3lix ↩︎

All iOS Versions Jailbreak https://pangu8.com/jailbreak/ ↩︎

MonkeyDev安装教程 https://github.com/AloneMonkey/MonkeyDev/wiki/安装 ↩︎

Android开发之给控件设置圆角边框

先上效果图:

%title插图%num

具体步骤:

1.在drawable文件夹下新建一个xml文件。

2.在里面填上以下内容:

  1. <?xml version=”1.0″ encoding=”utf-8″?>
  2. <!–自定义的控件圆角背景–>
  3. <shape xmlns:android=“http://schemas.android.com/apk/res/android”>
  4. <solid android:color=“@color/white”/>
  5. <padding android:top=“10px” android:bottom=“10px”/>
  6. <corners android:radius=“50px”/>
  7. <stroke android:width=“1px” android:color=“#f08200”/>
  8. </shape>

3.在xml文件中使用:

%title插图%num

4.注释:

corners ———-圆角

gradient ———-渐变

padding ———-内容离边界距离

size ————大小

solid  ———-填充颜色

stroke ———-描边

注意的是corners的属性bottomLeftRadius为右下角、bottomRightRadius为左下角

shape制作虚线

%title插图%num

没有dashGap属性则为实线

  1. <?xml version=”1.0″ encoding=”utf-8″?>
  2. <shape xmlns:android=“http://schemas.android.com/apk/res/android”
  3. android:shape=“line” >
  4. <stroke
  5. android:dashGap=“3dp”
  6. android:dashWidth=“8dp”
  7. android:width=“1dp”
  8. android:color=“#63a219” />
  9. <size android:height=“1dp” />
  10. </shape>

4.0以上虚线变实线在xml文件中增加:

  1. <TextView
  2. android:layout_width=“match_parent”
  3. android:layout_height=“wrap_content”
  4. android:background=“@drawable/xuxian”
  5. android:layerType=“software” />

 

shape制作渐变

%title插图%num

  1. <?xml version=”1.0″ encoding=”utf-8″?>
  2. <shape xmlns:android=“http://schemas.android.com/apk/res/android” >
  3. <gradient
  4. android:angle=“270.0”
  5. android:endColor=“#ffffff”
  6. android:startColor=“#000000” />
  7. </shape>

 

Android如何设置圆角按钮

1. 在res目录下的drawable目录下新建shape.xml文件

<?xml version=”1.0″ encoding=”utf-8″?>
<shape xmlns:android=”http://schemas.android.com/apk/res/android”
android:shape=”rectangle” >

<!– 填充的颜色 –>
<solid android:color=”#FF065E8D” />

<!– 设置按钮的四个角为弧形 –>
<!– android:radius 弧形的半径 –>
<corners android:radius=”15dip” />

<!– padding:Button里面的文字与Button边界的间隔 –>
<padding
android:bottom=”10dp”
android:left=”10dp”
android:right=”10dp”
android:top=”10dp” />
</shape>

2.在布局文件中调用。

<?xml version=”1.0″ encoding=”utf-8″?>
<LinearLayout xmlns:android=”http://schemas.android.com/apk/res/android”
android:layout_width=”fill_parent”
android:layout_height=”fill_parent”
android:orientation=”vertical” >

<Button
android:id=”@+id/roundButton”
android:layout_width=”wrap_content”
android:layout_height=”wrap_content”
android:background=”@drawable/shape”
android:text=”圆角按钮” />
</LinearLayout>

————————————————

android studio实现圆角的button

操作过程
1. 在drawable中新建一个button_circle_shape.xml
但是建立这个xml是有操作的,因为从drawable右键是创建不了xml的, 具体操作如下:

右键res–>New–>Android resourse file

%title插图%num

注意Root element 是不能选择的 是直接填写为shape, 默认应该是selector 把它改为shape即可

%title插图%num

然后就可以看见在drawable 成功添加了xml

%title插图%num
2.填写代码
button_circle_shape.xml 内容如下
这个xml里有一个shape,此shape规定了圆角按钮的样式

<?xml version=”1.0″ encoding=”UTF-8″?>
<shape
xmlns:android=”http://schemas.android.com/apk/res/android”
android:shape=”rectangle”>
<!– 填充的颜色 –>
<solid android:color=”#FFFFFF” />
<!– android:radius 弧形的半径 –>
<!– 设置按钮的四个角为弧形 –>
<corners
android:radius=”5dip” />
<!–也可单独设置–>
<!– <corners –>
<!– android:topLeftRadius=”10dp”–>
<!– android:topRightRadius=”10dp”–>
<!– android:bottomRightRadius=”10dp”–>
<!– android:bottomLeftRadius=”10dp”–>
<!– /> –>
**设置文字padding**
<!– padding:Button里面的文字与Button边界的间隔 –>
<padding
android:left=”10dp”
android:top=”10dp”
android:right=”10dp”
android:bottom=”10dp”
/>
</shape>

3.使用shape:
给button的background属性赋值为刚创建的

android:background=”@drawable/button_circle_shape”
————————————————

Android BMI体质计算器实现

本文源于安卓基础,主要介绍如何实现BMI体质计算器。

先讲规则后讲实现

体质计算规则

胖瘦程度

体质指数

过轻

男性低于20,女性低于19

适中

男性20-25,女性19-24

超重

男性25-30,女性24-29

肥胖

男性30-35,女性29-34

严重肥胖

男性高于35,女性高于34

测试效果

案例打印出保留两位BMI指数,并且对于身高体重小于0,异常不处理!

实例步骤

创建项目My eleApplication

点进Project—>Empty Activity—>然后名字改下,finish即可。成功之后,点击箭头运行程序。

程序正常可以跑成功hello world字样,下面我们继续

布局activity_main.xml

大家从实验效果可以看出,这里用了不少控件。三个TextView,两个EditText,两个单选按钮控件,一个按钮控件,代码下方对内容作进一步分析!

xmlns:app=”http://schemas.android.com/apk/res-auto”

xmlns:tools=”http://schemas.android.com/tools”

android:layout_width=”match_parent”

android:layout_height=”match_parent”

android:orientation=”vertical”>

android:layout_width=”wrap_content”

android:layout_height=”wrap_content”

android:text=”身高(cm)”

android:id=”@+id/txt1″/>

android:layout_width=”wrap_content”

android:layout_height=”wrap_content”

android:id=”@+id/edX”/>

android:layout_width=”wrap_content”

android:layout_height=”wrap_content”

android:text=”体重(kg)”

android:id=”@+id/txt2″/>

android:layout_width=”wrap_content”

android:layout_height=”wrap_content”

android:id=”@+id/edY”/>

android:layout_width=”match_parent”

android:layout_height=”wrap_content”

android:orientation=”horizontal”

android:id=”@+id/rg”>

android:layout_width=”wrap_content”

android:layout_height=”wrap_content”

android:text=”男”

android:id=”@+id/rb1″

android:layout_marginRight=”30dp”

android:checked=”true”/>

android:layout_width=”wrap_content”

android:layout_height=”wrap_content”

android:text=”女”

android:id=”@+id/rb2″

/>

android:layout_width=”wrap_content”

android:layout_height=”wrap_content”

android:id=”@+id/btn”

android:text=”计算BMI值”/>

android:layout_width=”wrap_content”

android:layout_height=”wrap_content”

android:id=”@+id/tvResult”/>

LinearLayout详解

这是基础的线性布局,只需要配置width与height。水平方向即可

TextView详解

我们用了三个,其中一个是输出结果,另外两个只是为了代码更友好。具体的也是基础设置。

RadioButton详解

要想使用单选按钮必须要设置按钮组,然后一些基本的配置,包括text,id,width与height。id是后期获得操作的。必须设置

EditText详解

很多时候,编辑文本是在初学者时期需要用到的。因此id必须设置

搭建MainActivity.java代码

java代码在完成这个案例时只需要三步,这也是翁恺老师经常说的三步:“输入-处理–输出”。输入就是指获取View种的所有对象。处理就是指能根据输入值找出判断依据,输出就是把答案抛出来。

package com.example.myeleapplication;

import androidx.appcompat.app.AppCompatActivity;

import android.app.Activity;

import android.os.Bundle;

import android.view.View;

import android.widget.Button;

import android.widget.EditText;

import android.widget.RadioButton;

import android.widget.TextView;

import org.w3c.dom.Text;

public class MainActivity extends Activity implements View.OnClickListener {
RadioButton rb1;

RadioButton rb2;

TextView tvResult;

EditText txt1;

EditText txt2;

Button btn;

@Override

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

setViews();

}

public void setViews() {
rb1 = (RadioButton) findViewById(R.id.rb1);

rb2 = (RadioButton) findViewById(R.id.rb2);//判断男女

tvResult = (TextView) findViewById(R.id.tvResult);

txt1 = (EditText)findViewById(R.id.edX);

txt2 = (EditText)findViewById(R.id.edY);

btn = (Button)findViewById(R.id.btn);

btn.setOnClickListener(this);

}

@Override

public void onClick(View v) {
double x = Double.parseDouble(txt1.getText().toString());//身高

double y = Double.parseDouble(txt2.getText().toString());//体重//体重除以身高的平方

double res;

String str = “Your BMI is”;

if(x<=0 || y<=0) {
tvResult.setText(“值异常,不计算”);

return ;

}

x = x/100;

res = y / (x*x);

String str1 = String.format(“%.2f”,res);

str = str + str1;

if(rb1.isChecked())

res -= 1;//以女性为标准进行比较

//仅以女性作为评价标准

str += “体型:”;

if(res < 19)

str += “过轻”;

else if(res < 24)

str += “适中”;

else if(res<29)

str += “超重”;

else if(res<34)

str += “肥胖”;

else

str += “严重肥胖”;

tvResult.setText(str);

}

}

点击运行,获取结果

总结

执念并在此总结了实例的步骤:

创建项目,跑通hello world

搭建界面

配置java代码

点击运行,收获喜悦

希望本文能帮助到大家!
————————————————