这个是很早很早的笔记,当时记录的也不完整,谨慎参考。
对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为例:
找到项目目录下proguard-rules.pro文件,在其中添加:
-assumenosideeffects class android.util.Log { public static ** d(…); public static ** v(…); }
找到项目录下的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, 点击进行同步。
这里使用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中的每一行其实都是一个单独的布局(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);
};
}
});
完事。