Android开发学习记录(2015-05-19 23:05:34更新)

限于喜欢 提交于 2020-02-29 11:12:56

占个坑位,日后增加,哈哈

-----------------分割线-------------------

发了以上这篇日志,居然意外的访问量飙升,几小时阅读破百。

真心搞不懂,是不是我这个标题太惹人注意了。真心感觉对不起观众。我一定会抓紧学习。多记录些。

-----------------分割线-------------------


学着组织一个Android App

2015-05-15 01:10:37

    之前做一个练手App,把公司手机网站做成了Android原生界面,没有写啥代码。主要是为了熟悉

  • Android自带控件的属性

  • 视图布局的组织

  • Activity的生命周期、跳转、传值等

    现在开始着手开展第二个练手的App。方向是做一个大学的新闻的客户端。我想应该有很多可以值得实践的。始终觉得一个良好的代码组织结构,是一个优秀程序的良好开端。在github还有gitosc上找了一些新闻客户端,做参考。感觉结构挺混乱的,仅仅为了练手的 感觉。所以只能找非新闻类的开源App来做参考,正好今天欣喜的发现osc的Android开源客户端的v2版本已经公布在gitosc上。于是边学分析,边学着开始做下。

    首先在App的包下有4个文件,作为初学者,我一开始不太明白,为啥需要这几个东西。

    研究了一会以后,我觉得大概可能是这样子的:

  1. AppConfig:应用程序配置类,方便在应用代码各处调用到配置信息

  2. AppContent:继承于Application,全局应用程序类,可以对应用的整个生命周期进行一个控制,另外给非Activity类提供context。

  3. AppException:应用程序异常类,用于捕获异常和提示错误信息。可以对错误和异常做一些自定义操作,比如记录日志、上传到第三方服务平台等

  4. 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

找谷哥、度娘随便一问,一箩筐,这里就不再赘述了。只在此记录下,自己觉得的重要的几个要点:

  1. 区分onCreate和onCreateView

    onCreate是指创建该fragment,类似于Activity.onCreate,你可以在其中初始化除了view之外的东西;

    onCreateView是创建该fragment对应的视图,你必须在这里创建自己的视图并返回给调用者。具体代码中的呈现为return一个view。

  2. 如果需要调用包含fragment的Activity相关的内容,需要在onActivityCreated中进行,以确保Activity已被构建完毕。

  3. 通常会使用一个空的FrameLayout作为fragment的容器。

    初始化的时候,可以什么都没有。在Activity在运行过程中,在FrameLayout中添加、删除、替换Fragment。

    比如:

    getFragmentManager().beginTransaction().replace(R.id.xxxx,new xxxxFragment()).commit();

  4. 太多使用场景了,暂时还没有在实践项目中用到,后续肯定还有很多,以后在再更新

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

占个坑

使用开源组件,实现上拉刷新,下拉加在更多

占个坑

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!