占个坑位,日后增加,哈哈
-----------------分割线-------------------
发了以上这篇日志,居然意外的访问量飙升,几小时阅读破百。
真心搞不懂,是不是我这个标题太惹人注意了。真心感觉对不起观众。我一定会抓紧学习。多记录些。
-----------------分割线-------------------
学着组织一个Android App
2015-05-15 01:10:37
之前做一个练手App,把公司手机网站做成了Android原生界面,没有写啥代码。主要是为了熟悉
Android自带控件的属性
视图布局的组织
Activity的生命周期、跳转、传值等
现在开始着手开展第二个练手的App。方向是做一个大学的新闻的客户端。我想应该有很多可以值得实践的。始终觉得一个良好的代码组织结构,是一个优秀程序的良好开端。在github还有gitosc上找了一些新闻客户端,做参考。感觉结构挺混乱的,仅仅为了练手的 感觉。所以只能找非新闻类的开源App来做参考,正好今天欣喜的发现osc的Android开源客户端的v2版本已经公布在gitosc上。于是边学分析,边学着开始做下。
首先在App的包下有4个文件,作为初学者,我一开始不太明白,为啥需要这几个东西。
研究了一会以后,我觉得大概可能是这样子的:
AppConfig:应用程序配置类,方便在应用代码各处调用到配置信息
AppContent:继承于Application,全局应用程序类,可以对应用的整个生命周期进行一个控制,另外给非Activity类提供context。
AppException:应用程序异常类,用于捕获异常和提示错误信息。可以对错误和异常做一些自定义操作,比如记录日志、上传到第三方服务平台等
AppManger:其实做一个就是ActivityManger,对Activity的栈进行管理(我暂时这么理解)。《第一行代码》中,举了个例子,打开了N个Acitviy后,想在程序中直接退出。那么就需要销毁所有的Activity,那这个时候,就需要有个东西来记录,到底哪里Activity被创建了、已被销毁、还存在哪些,才能在需要的时候做相应的操作。
当然,以上几个文件,结构都是参考osc的App,但是里面的代码我暂时还都空着。我想每个App在结构上都是需要这几个文件的,但肯定会有差异。所以准备慢慢往下写。在必要的时候,加入必要的代码。
另外,在这个App中我选择了XUtils作为辅助工具库,现在还是小白,先借别人的成果用下。作为工程师,我觉得没有必要重复早轮子。但是必须知道轮子是怎么造出来的。留着日后慢慢研究:)
在Android Studio中学会如何使用调试
2015-05-15 12:19:46
1 2 3 4 5 6 7 8 |
alt+f8 debug时选中查看值 f8相当于eclipse的f6跳到下一步 shift+f8相当于eclipse的f8跳到下一个断点,也相当于eclipse的f7跳出函数 f7相当于eclipse的f5就是进入到代码 alt+shift+f7这个是强制进入代码 ctrl+shift+f9 debug运行java类 ctrl+shift+f10正常运行java类 command+f2停止运行 |
Intellij IDEA调试功能使用总结
http://www.cnblogs.com/Bowu/p/4026117.html
Android中延迟执行某个任务
2015-05-16 11:39:07
暂时主要用于启动切面延迟几面以后跳转到主界面。
http://my.oschina.net/zx0211/blog/415629
使用注解来代替findViewById、onclick等事件
2015-05-17 00:53:44
决定不用xutils,仅作参考。改用osc的app中使的butterknife作为注解工具,看了下感觉挺不错的。注释虽然是英文的感觉还是蛮全的,比较喜爱。
作为新手,比较原始的代码可能是这样子的:
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_start);
final TextView tvTest = (TextView) findViewById(R.id.tv_test);
tvTest.setText("i am test");
tvTest.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
tvTest.setText("i am superman");
}
}); }
用了注解以后,感觉代码层次性更强了,也更加优雅了,duang的一下高富帅的感觉:
@InjectView(R.id.tv_test) TextView tvTest; @Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_start);
ButterKnife.inject(this);
tvTest.setText("i am test"); } @OnClick(R.id.tv_test) public void tvTest_OnClick() {
tvTest.setText("i am superman"); }
还有很多地方可以用到,这里只是举个例子,还有很多可以让你用:
学会Fragment的基本使用
2015-05-19 22:18:17
Fragment是个什么东西?
A Fragment represents a behavior or a portion of user interface in an Activity. You can combine multiple fragments in a single activity to build a multi-pane UI and reuse a fragment in multiple activities. You can think of a fragment as a modular section of an activity, which has its own lifecycle, receives its own input events, and which you can add or remove while the activity is running (sort of like a "sub activity" that you can reuse in different activities).
摘自:http://developer.android.com/guide/components/fragments.html
Fragment相当于在一个Activity中的一个行为或一部分。你可以在一个Activity中结合多个Fragment来用于构建多视图(多窗格?),还可以在多Activity中服用一个Fragment。布局中构建一个多窗格的UI和重用在多个活动单活性片段。你可以认为fragment是Activity的一个模块化的部件,并且有它自己的生命周期,接受他自己的输入事件,甚至你可以在Activity运行的时候将它添加或者删除。(有点像一个“子Activity”,你可以在不同的Activity中重复使用)。
英语水平有限,凑合着看吧:)越来越觉得看谷歌的文档非常重要,简单的一段话,足以让你明白fragment的重要性。我隐约觉得,这将对构建一个结构合理的App至关重要。
Fragment的生命周期
和Activity一样Fragment,拥有自己的独立的生命周期。但是和Activity相比,他的生命周期可能更加多一点。因为Fragment最终还是需要依托于Fragment。
以下一张图,可以让我们通过与Activity生命周期的对比,来了解Fragment的生命周期:
Fragment的基础使用方法
2015-05-19 23:07:51
找谷哥、度娘随便一问,一箩筐,这里就不再赘述了。只在此记录下,自己觉得的重要的几个要点:
区分onCreate和onCreateView
onCreate是指创建该fragment,类似于Activity.onCreate,你可以在其中初始化除了view之外的东西;
onCreateView是创建该fragment对应的视图,你必须在这里创建自己的视图并返回给调用者。具体代码中的呈现为return一个view。
如果需要调用包含fragment的Activity相关的内容,需要在onActivityCreated中进行,以确保Activity已被构建完毕。
通常会使用一个空的FrameLayout作为fragment的容器。
初始化的时候,可以什么都没有。在Activity在运行过程中,在FrameLayout中添加、删除、替换Fragment。
比如:
getFragmentManager().beginTransaction().replace(R.id.xxxx,new xxxxFragment()).commit();
太多使用场景了,暂时还没有在实践项目中用到,后续肯定还有很多,以后在再更新
Adapter的基本使用
2015-05-20 01:50:55
阅读文章:http://www.cnblogs.com/devinzhang/archive/2012/01/20/2328334.html
虽然这篇文章中有些类已经Deprecated了,自己稍微看下Android的源码就知道用什么类代替了。除此之外,通过这篇文章,足以带你体验一下Adapter的基本使用。
记录下自己的实践代码
/*
* Copyright (c) 2005-2015. CNVP by Michael.Z
*/
package com.cnvp.zstunews.ui;
import android.app.Fragment;
import android.database.Cursor;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.support.annotation.Nullable;
import android.support.v4.widget.SimpleCursorAdapter;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.Toast;
import com.cnvp.zstunews.AppContext;
import com.cnvp.zstunews.R;
import java.util.ArrayList;
import java.util.List;
/**
* @author 听风 Michael.Z
*/
public class TestFragment extends Fragment {
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
LinearLayout ll = (LinearLayout) inflater.inflate(R.layout.test_fragment, container, false);
ListView listView = new ListView(container.getContext());
// 简单使用,未注释部分功能为读取手机联系人名字,并显示到ListView,并且点击的时候用Toast显示名字
// listView.setAdapter(new ArrayAdapter<>(container.getContext(), android.R.layout.simple_expandable_list_item_1, getData()));
final Cursor cur = getActivity().getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
SimpleCursorAdapter curAdp = new SimpleCursorAdapter(container.getContext(),
android.R.layout.simple_list_item_2, cur, new String[] {
ContactsContract.Contacts.DISPLAY_NAME, ContactsContract.Contacts.CONTACT_STATUS },
new int[] { android.R.id.text1, android.R.id.text2 }, 0);
listView.setAdapter(curAdp);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Toast.makeText(getApplication(), cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)), Toast.LENGTH_SHORT).show();
}
});
ll.addView(listView);
return ll;
}
private List<String> getData() {
List<String> data = new ArrayList<>();
data.add("测试数据1");
data.add("测试数据2");
data.add("测试数据3");
data.add("测试数据4");
return data;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
public AppContext getApplication() {
return (AppContext) getActivity().getApplication();
}
}
获取服务器数据
第三方库:Android-async-http、Volley、Apache HttpClient、HttpURLConnection
把数据写本地数据库
占个坑
读取本地数据库,并显示到ListView
占个坑
使用开源组件,实现上拉刷新,下拉加在更多
占个坑
来源:oschina
链接:https://my.oschina.net/u/2010795/blog/415015