android开发

作者: 李佶澳   转载请保留:原文地址   发布时间:2014/08/14 23:07:03

摘要

对Android和IOS的应用开发的了解程度都是零。对Java和苹果新推出Swift语言的了解程度也相差不多(Object-C肯定是不考虑的了)。

后来发现Swift语言的Beta5版本在语法方面变动了不少的内容, 特别是删除了一些语法,这才醒悟到这款语言还没能最终定型, 所以决定先做Android平台。

2016-12-06 00:18:35

计划做的app,半途而废了~~

日志管理

了解了基本的语法、基础的使用之后, 把日志管理作为接下来的第一项内容是一点都不过分的。因为梳理出一套适合的日志管理方式之后, 可以大大的减少之后的调试和发布所需要的时间。试想一下,如果代码中杂乱无章的充斥着各种各样的print, 调试的时候陷入到一堆样式各异的日志中, 发布的时候到处删除日志代码的景象。

Android中有两个日志包:

android.util.Log

这里使用的是android.util.Log, 因为这个相当简单。例如:

Log.e(DEBUG_TAG, "Error ....")
Log.d(DEBUG_TAG, "Error ....")

发布的时候需要关闭调试日志, 奇怪的是不知为什么android.util.Log中没有提供日志开关, 也没有找到类似C语言那样使用宏定义的方式。网上查找了一些方法之后, 倾向于使用proguard的方式关闭日志输出。

proguard实质上一个代码混淆工具, 用来增加代码被反编译的难度。利用proguard关闭日志实质上是通过配置proguard的规则, 在编译时把日志相关的代码删除掉。

以在Android Studio为例:

  1. 找到项目目录下proguard-rules.pro文件,在其中添加:

    -assumenosideeffects class android.util.Log { public static ** d(…); public static ** v(…); }

  2. 找到项目录下的build.gradle文件, 修改如下:

    buildTypes { release {

         //runProguard false
         runProguard true  
             //这里默认是false, 改成true
    
         //proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
         proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
             //默认使用的是proguard-android.txt, 这个文件中关闭了优化选项, 会导致日志代码没被删除
             //修改为使用proguard-android-optimize.txt
     }  }
    

    另外, 在这个文件中getDefaultProguardFile会被标注显示为找不到该符号,不用理会。

改动之后,Android Studio编辑区上部会提示Gradle Sync, 点击进行同步。

  1. 工具栏Build – Generate Sign Apk, 在编译对话框中选择release。

这里使用proguard的方式没有做到对不同的模块分别设置开关(不确定是否可以通过proguard的配置规则实现), 个人感觉已经足够了,毕竟只是一个App而已, 在打log时使用好TAG就足够了。

例如:

public class HomePage extends Activity {
	private final static String DEBUG_TAG = "HomePage";   //class HomePage 的日志TAG是 HomePage

	...

	Log.d(DEBUG_TAG, "Some info ....")

基本概念

非资深人士,纯属业余玩票, 这里粗浅的说一下的自己的理解。

Android应用的主体是多个Activity, 每个Activity代表一个界面, 界面的布局通过一个xml文件描述(当然可以不使用xml,直接在代码里创建, 显然还是xml方便)。每个Activity有一套固定方法调用顺序,例如onCreate、onStart等, 通过在Activity内用自己实现的这些方法覆盖掉默认方法的方式来控制Activity中的内容。所以很大一部分工作都是在和Activity打交道。

Activity完成的是界面的展示以及交互, 而app还需要很多在后台默默工作的东西,这时候就需要用到Android中的另一个主角——IntentService。IntentService说白就是在后台运行的,没有界面。可以从Activity中向IntentService中发送消息, Intentservice也可以向Activity发现消息。因此可以通过Intentservice将Activity更灵活的联系到一起。

剩下的内容主要就是各种组件,例如文本框、编辑框、按钮、列表、滑动条等UI组件。还有一些常规性的内容,例如怎样保存数据、网络通信、线程之类的,基本就是巴拉巴拉Android的各种库。

从实现的角度看基本就是这些内容, 搭积木一样拼拼凑凑形成一款app。但是在做app时最耗费时间和精力其实是怎样设计UI, 以及如何实现各种UI效果。个人认为这个才是最难的, 尤其是作为一个一直在命令行下工作的码农,比如, 有多少种颜色、颜色之间如何搭配、透明还是半透明、要用什么字体、多大的字号、怎么样安排布局等等, 不仅需要掌握各种琐碎的视觉元素, 还是具备审美… 呃,审美, 这个很是个问题…

实现ListView的点击展开

期望: 点击ListView的时候,被点击的条目会向下展开,显示更多的内容, 再次点击收起内容。

ListView中的每一行其实都是一个单独的布局(Layout), 这里就暂时称之为行布局。所谓的展开、收起等,其实就是直接利用ListView提供的接口操作行布局, 展开的就是把行布局中隐藏的元素设置为显示,收起就是重新设置为隐藏。

所以,首先不要管别,先设计一个行布局, 行布局就是一个单独的xml文件, 在代码中将其制定给对应的Listview, 如下:

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
	android:orientation="vertical" android:layout_width="match_parent"
	android:layout_height="match_parent">

	<LinearLayout
		android:orientation="vertical"
		android:layout_width="match_parent"
		android:layout_height="wrap_content">
		<TextView
			android:id="@+id/find_team_name"
			android:layout_width="wrap_content"
			android:layout_height="wrap_content"
			android:textAppearance="?android:attr/textAppearanceListItem"
			android:gravity="center_vertical"
			android:paddingLeft="?android:attr/listPreferredItemPaddingLeft"
			android:paddingRight="?android:attr/listPreferredItemPaddingRight"
			android:minHeight="?android:attr/listPreferredItemHeightSmall"
			/>

		<TextView
			android:id="@+id/find_team_tag"
			android:layout_width="wrap_content"
			android:layout_height="wrap_content"
			android:textAppearance="?android:attr/textAppearanceListItemSmall"
			android:gravity="center_vertical"
			android:paddingLeft="?android:attr/listPreferredItemPaddingLeft"
			android:paddingRight="?android:attr/listPreferredItemPaddingRight"
			android:minHeight="?android:attr/listPreferredItemHeightSmall"
			/>
		<Button
			android:layout_width="wrap_content"
			android:layout_height="wrap_content"
			android:id="@+id/findteam_result_join"
			android:text="@string/join"
			android:layout_gravity="right"
			android:focusable="false"/>
	</LinearLayout>

	<LinearLayout
		android:id="@+id/lv_find_team_detail"
		android:orientation="vertical"
		android:layout_width="match_parent"
		android:layout_height="wrap_content"
		android:visibility="gone">
		<TextView
			android:id="@+id/find_team_descripe"
			android:layout_width="wrap_content"
			android:layout_height="wrap_content"
			android:textAppearance="?android:attr/textAppearanceListItemSmall"
			android:gravity="center_vertical"
			android:paddingLeft="?android:attr/listPreferredItemPaddingLeft"
			android:paddingRight="?android:attr/listPreferredItemPaddingRight"
			android:minHeight="?android:attr/listPreferredItemHeightSmall"
			/>
	</LinearLayout>

</LinearLayout>

注意嵌套的第二个LinearLayout设置为俄gone, 也就是默认隐藏的。只需要在ListView的listern中,收到点击是,将其设置为可见就可以了。如下:

ListView lv = (ListView) findViewById(R.id.lv_find_team_result);

lv.setOnItemClickListener(new AdapterView.OnItemClickListener(){
	@Override
	public void onItemClick(AdapterView<?> adapterView, View view, int pos, long id) {
		HashMap<String, String> item = (HashMap<String, String>) adapterView.getItemAtPosition(pos);
		if((view.findViewById(R.id.lv_find_team_detail).getVisibility() &View.GONE) >0){
			view.findViewById(R.id.lv_find_team_detail).setVisibility(View.VISIBLE);
		}else{
			view.findViewById(R.id.lv_find_team_detail).setVisibility(View.GONE);
		};
	}
});

完事。

限时活动,每邀请一人即返回25元!

Copyright @2011-2018 All rights reserved. 转载请添加原文连接,合作请加微信lijiaocn或者发送邮件: lijiaocn@foxmail.com,备注网站合作 友情链接: lijiaocn github.com