2013-05-20 小结

发布时间:2013-05-27 ANDROID

RefreshView下拉刷新问题

public class RefreshListView extends ListView implements OnScrollListener, OnClickListener{

    public interface IListViewState
    {
        int LVS_NORMAL = 0;                    //  普通状态
        int LVS_PULL_REFRESH = 1;            //  下拉刷新状态
        int LVS_RELEASE_REFRESH = 2;        //  松开刷新状态
        int LVS_LOADING = 3;                //  加载状态
    }
    
    
    public interface IOnRefreshListener
    {
        void onRefresh();
    }
    
    
    private View mHeadView;                
    private TextView mRefreshTextview;
    private TextView mLastUpdateTextView;
    private ImageView mArrowImageView;
    private ProgressBar mHeadProgressBar;
    
    private int mHeadContentWidth;
    private int mHeadContentHeight;

    private IOnRefreshListener mOnRefreshListener;            // 头部刷新监听器
    
    // 用于保证startY的坐标在一个完整的touch事件中只被记录一次
    private boolean mIsRecord = false;
    // 标记的Y坐标值
    private int mStartY = 0;
    // 当前视图能看到的第一个项的索引
    private int mFirstItemIndex = -1;
    // MOVE时保存的Y坐标值
    private int mMoveY = 0;
    // LISTVIEW状态
    private int mViewState = IListViewState.LVS_NORMAL;

    private final static int RATIO = 2;
    
    private RotateAnimation animation;
    private RotateAnimation reverseAnimation;//旋转变化动画

    private boolean mBack = false;
    

    
    public RefreshListView(Context context) {
        super(context);
        // TODO Auto-generated constructor stub
        init(context);
    }

    
    public RefreshListView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init(context);
    }
    
    public void setOnRefreshListener(IOnRefreshListener listener)
    {
        mOnRefreshListener = listener;
    }
    
    private void onRefresh()
    {
        if (mOnRefreshListener != null)
        {
            mOnRefreshListener.onRefresh();
        }
    }
    
    public void onRefreshComplete()
    {
        mHeadView.setPadding(0,  -1 * mHeadContentHeight, 0, 0);
        mLastUpdateTextView.setText("上次更新:" + new Date().toLocaleString());
        switchViewState(IListViewState.LVS_NORMAL);
    }
    
    private void init(Context context)
    {
        initHeadView(context);
        
        //initLoadMoreView(context);
        
        setOnScrollListener(this);
    }
    
    
    // 初始化headview试图
    private void initHeadView(Context context)
    {
        mHeadView = LayoutInflater.from(context).inflate(R.layout.head, null);

        mArrowImageView = (ImageView) mHeadView.findViewById(R.id.head_arrowImageView);
        mArrowImageView.setMinimumWidth(60);


        mHeadProgressBar= (ProgressBar) mHeadView.findViewById(R.id.head_progressBar);
        
        mRefreshTextview = (TextView) mHeadView.findViewById(R.id.head_tipsTextView);
        
        mLastUpdateTextView = (TextView) mHeadView.findViewById(R.id.head_lastUpdatedTextView);

        measureView(mHeadView);
        mHeadContentHeight = mHeadView.getMeasuredHeight();
        mHeadContentWidth = mHeadView.getMeasuredWidth();

        mHeadView.setPadding(0, -1 * mHeadContentHeight, 0, 0);
        mHeadView.invalidate();

        addHeaderView(mHeadView, null, false);
        
        animation = new RotateAnimation(0, -180,
                RotateAnimation.RELATIVE_TO_SELF, 0.5f,
                RotateAnimation.RELATIVE_TO_SELF, 0.5f);
        animation.setInterpolator(new LinearInterpolator());
        animation.setDuration(250);
        animation.setFillAfter(true);

        reverseAnimation = new RotateAnimation(-180, 0,
                RotateAnimation.RELATIVE_TO_SELF, 0.5f,
                RotateAnimation.RELATIVE_TO_SELF, 0.5f);
        reverseAnimation.setInterpolator(new LinearInterpolator());
        reverseAnimation.setDuration(200);
        reverseAnimation.setFillAfter(true);
    }
    
    // 初始化footview试图
//    private void initLoadMoreView(Context context)
//    {
//        mFootView= LayoutInflater.from(context).inflate(R.layout.loadmore, null);
//        
//        mLoadMoreView = mFootView.findViewById(R.id.load_more_view);
//        
//        mLoadMoreTextView = (TextView) mFootView.findViewById(R.id.load_more_tv);
//        
//        mLoadingView = mFootView.findViewById(R.id.loading_layout);
//    
//        mLoadMoreView.setOnClickListener(this);
//        
//        addFooterView(mFootView);
//
//    }
    
    // 此方法直接照搬自网络上的�?��下拉刷新的demo,计算headView的width以及height
    private void measureView(View child) {
        ViewGroup.LayoutParams p = child.getLayoutParams();
        if (p == null) {
            p = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,
                    ViewGroup.LayoutParams.WRAP_CONTENT);
        }
        int childWidthSpec = ViewGroup.getChildMeasureSpec(0, 0 + 0, p.width);
        int lpHeight = p.height;
        int childHeightSpec;
        if (lpHeight > 0) {
            childHeightSpec = MeasureSpec.makeMeasureSpec(lpHeight,
                    MeasureSpec.EXACTLY);
        } else {
            childHeightSpec = MeasureSpec.makeMeasureSpec(0,
                    MeasureSpec.UNSPECIFIED);
        }
        child.measure(childWidthSpec, childHeightSpec);
    }


    public void onScroll(AbsListView arg0, int firstVisiableItem, int visibleItemCount, int totalItemCount) {
        mFirstItemIndex = firstVisiableItem;

    }

    public void onScrollStateChanged(AbsListView arg0, int arg1) {
        
        
    }

    
    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        // TODO Auto-generated method stub
                
        if (mOnRefreshListener != null)
        {
            switch (ev.getAction()) {
            case MotionEvent.ACTION_DOWN:        
                doActionDown(ev);
                break;
            case MotionEvent.ACTION_MOVE:
                doActionMove(ev);
                break;
            case MotionEvent.ACTION_UP:
                doActionUp(ev);
                break;
            default:
                break;
            }    
        }
        
                
        return super.onTouchEvent(ev);
    }
    
    private void doActionDown(MotionEvent ev)
    {
        if(mIsRecord == false && mFirstItemIndex == 0)
        {
            mStartY = (int) ev.getY();
            mIsRecord = true;
        }
    }
    
    private void doActionMove(MotionEvent ev)
    {
        mMoveY = (int) ev.getY();
        
        if(mIsRecord == false && mFirstItemIndex == 0)
        {
            mStartY = (int) ev.getY();
            mIsRecord = true;
        }
        
        if (mIsRecord == false || mViewState == IListViewState.LVS_LOADING)
        {
            return ;
        }    
        
        int offset = (mMoveY - mStartY) / RATIO;    
        
        switch(mViewState)
        {
            case IListViewState.LVS_NORMAL:
            {
                if (offset > 0)
                {        
                    mHeadView.setPadding(0, offset - mHeadContentHeight, 0, 0);
                    switchViewState(IListViewState.LVS_PULL_REFRESH);
                }
            }
                break;
            case IListViewState.LVS_PULL_REFRESH:
            {
                setSelection(0);
                mHeadView.setPadding(0, offset - mHeadContentHeight, 0, 0);
                if (offset < 0)
                {
                    switchViewState(IListViewState.LVS_NORMAL);
                }else if (offset > mHeadContentHeight)
                {
                    switchViewState(IListViewState.LVS_RELEASE_REFRESH);
                }
            }
                break;
            case IListViewState.LVS_RELEASE_REFRESH:
            {
                setSelection(0);
                mHeadView.setPadding(0, offset - mHeadContentHeight, 0, 0);
                if (offset >= 0 && offset <= mHeadContentHeight)
                {
                    mBack = true;
                    switchViewState(IListViewState.LVS_PULL_REFRESH);
                }else if (offset < 0)
                {
                    switchViewState(IListViewState.LVS_NORMAL);
                }else{
                
                }
                
            }
                break;
            default:
                return;
        };        
        
    }
    private void doActionUp(MotionEvent ev)
    {
        mIsRecord = false;
        mBack = false;
        
        if (mViewState == IListViewState.LVS_LOADING)
        {
            return ;
        }
        
        switch(mViewState)
        {
        case IListViewState.LVS_NORMAL:
        
            break;
        case IListViewState.LVS_PULL_REFRESH:
            mHeadView.setPadding(0, -1 * mHeadContentHeight, 0, 0);
            switchViewState(IListViewState.LVS_NORMAL);
            break;
        case IListViewState.LVS_RELEASE_REFRESH:
            mHeadView.setPadding(0, 0, 0, 0);
            switchViewState(IListViewState.LVS_LOADING);
            onRefresh();
            break;
        }    
        
    }

    private void switchViewState(int state)
    {    
        
        
        switch(state)
        {
            case IListViewState.LVS_NORMAL:
            {
                Log.e("!!!!!!!!!!!", "convert to IListViewState.LVS_NORMAL");
                mArrowImageView.clearAnimation();
                mArrowImageView.setImageResource(R.drawable.arrow);
            }
                break;
            case IListViewState.LVS_PULL_REFRESH:
            {
                Log.e("!!!!!!!!!!!", "convert to IListViewState.LVS_PULL_REFRESH");
                mHeadProgressBar.setVisibility(View.GONE);
                mArrowImageView.setVisibility(View.VISIBLE);
                mRefreshTextview.setText("下拉可以刷新");
                mArrowImageView.clearAnimation();

                // 是由RELEASE_To_REFRESH状态转变来的
                if (mBack)
                {
                    mBack = false;
                    mArrowImageView.clearAnimation();
                    mArrowImageView.startAnimation(reverseAnimation);
                }
            }
                break;
            case IListViewState.LVS_RELEASE_REFRESH:
            {
                Log.e("!!!!!!!!!!!", "convert to IListViewState.LVS_RELEASE_REFRESH");
                mHeadProgressBar.setVisibility(View.GONE);
                mArrowImageView.setVisibility(View.VISIBLE);
                mRefreshTextview.setText("松开获取更多");
                mArrowImageView.clearAnimation();
                mArrowImageView.startAnimation(animation);
            }
                break;
            case IListViewState.LVS_LOADING:
            {
                Log.e("!!!!!!!!!!!", "convert to IListViewState.LVS_LOADING");
                mHeadProgressBar.setVisibility(View.VISIBLE);
                mArrowImageView.clearAnimation();
                mArrowImageView.setVisibility(View.GONE);
                mRefreshTextview.setText("载入中..");
            }
                break;
                default:
                    return;
        }    
        
        mViewState = state;
        
    }


    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub
        
    }

布局文件

<?xml version="1.0" encoding="utf-8"?>
<!-- ListView的头部 -->

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content" >

    <!-- 内容 -->

    <RelativeLayout
        android:id="@+id/head_contentLayout"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:paddingLeft="30dp" >

        <!-- 箭头图像、进度条 -->

        <FrameLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:layout_centerVertical="true" >

            <!-- 箭头 -->

            <ImageView
                android:id="@+id/head_arrowImageView"
                android:layout_width="20dp"
                android:layout_height="30dp"
                android:layout_gravity="center"
                android:src="@drawable/arrow" />

            <!-- 进度条 -->

            <ProgressBar
                android:id="@+id/head_progressBar"
                style="?android:attr/progressBarStyleSmall"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center"
                android:visibility="gone" />
        </FrameLayout>

        <!-- 提示、最近更新 -->

        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true"
            android:gravity="center_horizontal"
            android:orientation="vertical" >

            <!-- 提示 -->

            <TextView
                android:id="@+id/head_tipsTextView"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="下拉刷新"
                android:textColor="@color/navajowhite"
                android:textSize="15sp" />

            <TextView
                android:id="@+id/head_lastUpdatedTextView"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="上次更新"
                android:textColor="@color/gold"
                android:textSize="10sp" />
        </LinearLayout>
    </RelativeLayout>

</LinearLayout>


如何使用:

package com.kalus.aidl;

import java.util.ArrayList;
import java.util.List;

import com.kalus.aidl.RefreshListView.IOnRefreshListener;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.widget.ArrayAdapter;
import android.widget.SimpleAdapter;

public class RefreshActivity extends Activity implements IOnRefreshListener {

    RefreshListView listview;
    ArrayAdapter<String> mAdapter;
    List<String> mData = new ArrayList<String>();
    GHandler handler;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.refresh);
        initData();
        handler = new GHandler();
        listview = (RefreshListView) findViewById(R.id.refresh);
        listview.setOnRefreshListener(RefreshActivity.this);
        mAdapter = new ArrayAdapter<String>(this,
                android.R.layout.simple_list_item_1, android.R.id.text1,
                mData);
        listview.setAdapter(mAdapter);
    }
    
    private void initData(){
        for(int i=0;i<10;i++){
            mData.add("mRefreshView:"+i);
        }
    }
    
    class GHandler extends Handler{
        @Override
        public void handleMessage(Message msg) {
            if(msg.what == 1){
                mAdapter.notifyDataSetChanged();
                listview.onRefreshComplete();
            }
        }
    }

    @Override
    public void onRefresh() {
        new Thread(){
            @Override
            public void run() {
                for(int i=10;i<20;i++){
                    mData.add(0, "mRefreshView:"+i);
                    try {
                        Thread.sleep(200);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    
                }
                
                handler.sendEmptyMessage(1);
            }
        }.start();
        
        
    }

}


该activity的布局是一个RefreshView的布局,即继承的那个布局


更多相关推荐


android中跨进程通讯的4种方式

发布时间:2013-12-06 跨进程通讯 ANDROID 通讯
由于android系统中应用程序之间不能共享内存。因此,在不同应用程序之间交互数据(跨进程通讯)就稍微麻烦一些。在androidSDK中提供了4种用于跨进程通讯的方式。这4种方式正好对应于android系统中4种应用程序组件:Activity、ContentProvider、Broadcast和Service。其中Activity可以跨进程调用其他应用程序的Activity;ContentProv...

热修复Tinker快速集成

发布时间:2017-05-26 补丁 ANDROID 热修复 TINKER
Tinker的快速集成不知道从啥时候热修复火了,这也是现在不得不会的技术啊,减少了版本迭代,对于突发情况有很好的应急解决措施,的确是一门很不错的技术。热补丁方案有很多,其中比较出名的有阿里的AndFix、美团的Robust以及QZone的补丁,今天聊得是腾讯的Tinker热修复,说实话,其实挺费劲儿的。Tinker腾讯的解释是:研发实力雄厚;服务全面快速;稳定可靠;就是很Diao!很NB的意思~~...

解决在非Activity中使用startActivity

发布时间:2015-12-15 ANDROID
错误提示信息:    Causedby:android.util.AndroidRuntimeException:CallingstartActivity()fromoutsideofanActivity contextrequirestheFLAG_ACTIVITY_NEW_TASKflag.Isthisreallywhatyouwant?原因:   activity继承了context重载了s...

往SystemUI添加进度条

发布时间:2012-12-08 ANDROID
1、定义一个进度条的布局文件  res/layout/notificat_progress.xml2、用RemoteViews显示布局  RemoteViewsview=newRemoteViews(getPackageName(),R.layout.notificat_progress);3、用Notification发布通知  Notification  notification=newNot...

Android摄像头回显拍照角度说明

发布时间:2022-10-08 ANDROID
1、摄像头组成手机摄像头主要由以下几个部分组成:PCB板、DSP(CCD用)、传感器(SENSOR)、固定器(HOLDER)、镜头(LENSASS′Y)。其中镜头(LENSASS′Y),DSP(CCD用),传感器(SENSOR)是最重要的三个部分。重点关注图像传感器图像传感器传感器将从镜头上传导过来的光线转换为电信号,再通过内部的DA转换为数字信号。由于传感器的每个pixel只能感光R光或者B光或...

Android手机实现通过网线直连设备通信

发布时间:2022-11-01 ANDROID
Android手机实现通过网线直连设备通信1、准备Android设备USB转RJ45网线转接头(淘宝搜索推荐使用绿联的)2、把busybox文件导入/system/bin目录下或手机ROOT。2选1实施3、执行shell命令设置设备静态ip,添加路由网关//设置以太网静态ip地址,添加路由网关ifconfigeth0192.168.1.111//添加路由网关iprouteadddefaultvia...

Android Jni示例

发布时间:2014-10-30 NDK 技术笔记 ANDROID JNI
1,工具下载eclipse(方便建立Android工程)和ADT2,下载 http://developer.android.com/tools/sdk/ndk/index.html#download,windows直接双击自解压就好,最好把ndk-build加入环境变量3,建立Android工程加入privatenativeStringtestJni(Stringinput)编译在bin目录下生成...

Android 读取excel(支持 xls)和 xml

发布时间:2022-11-22 EXCEL ANDROID XML
一、使用jxl读取excel文件1.build.gradle的dependencies中加入 implementation'net.sourceforge.jexcelapi:jxl:2.6.12'2.将xls文件复制到assets文件夹3.读取文件内容:publicstaticList&lt;ContentBean&gt;readExcelToAssets(Contextcontext){Lis...

Android SlidingMenu 布局实现

发布时间:2013-06-04 ANDROID FRAGMENT SLIDINGMENU
最近项目中用到了SlidingMenu布局效果,在网上搜索了不少资料才实现了这个布局效果,项目中用到了github上的一个开源项目,项目地址:https://github.com/jfeinstein10/SlidingMenu。兼容android2.1以上所有版本。工程项目结构如下图所示它引用了一个库项目SlidingMenu MainActivity.javapackagecom.yulore...

末日来临,App将何去何从

近几年智能手机和平板电脑的销量一直上升,2011年销量首次超越台式和笔记本电脑。智能设备销量上升要归功于移动应用的大量涌现,看AppStore和AndroidMarket的应用下载量就知道了。2012,App又将何去何从,会出现哪些新概念?  回顾2011年:  1.用户使用移动应用的时间超过了使用浏览器的时间  每天使用移动应用和普通浏览器的时间分别为81分钟和74分钟,而在一年前这个数据为64...

Android进阶:6、使用okhttp下载图片

发布时间:2022-11-24 ANDROID OKHTTP ANDROID 进阶教程
因为在网上找到的资源不只是一些字符串或是一些二进制数字,还是有的是可以肉眼看见的图片,那么我们在发送网络请求时拿到的是一张图片该如何显示在组件上面呢?这就要使用到okhttp的请求返回结果的一个属性(byteStream):varinput=result.byteStream()bitmap=BitmapFactory.decodeStream(input)myhanlder.sendEmptyM...

(一) Simple build files(简单的构建文件)

发布时间:2015-08-07 GRADLE ANDROID 应用 插件
Simplebuildfiles(简单的构建文件)一个最简单的Gradle纯Java项目的build.gradle文件包含以下内容:applyplugin:'java'这里引入了Gradle的Java插件。这个插件提供了所有构建和测试Java应用程序所需要的东西。最简单的Android项目的build.gradle文件包含以下内容:buildscript{repositories{mavenCen...

Android中对sd卡的读写权限问题

发布时间:2015-06-29 SD ANDROID
在Android中,要模拟SD卡,要首先使用adb的mksdcard命令来建立SD卡的镜像,如何建立,大家上网查一下吧,应该很容易找到,这里不说这个问题.    但是在应用程序执行起来以后,我们可以看到sdcard的执行权限很有问题.懂Linux的人都知道,这样的权限是无法在SD开中写入内容的,也就无法建立目录.    但是,我们在adbshell命令中,依然可以在sdcard中建立目录,写入文件...

Android Fragments Example

发布时间:2015-04-09 ANDROID 平板 ANDROID 3.0
AFragmentrepresentsaportionofauserinterfaceoranoperationthatrunswithinanActivity.Asingleactivitycancontainmultiplefragmentsandmanyfragmentscanbereusedinmany,differentactivities.Itisnotwrongifwesaythat...

Android SlidingPaneLayout: Tutorial

发布时间:2014-10-20 ANDROID
TopicscoveredAndroidSlidingPaneLayoutSlidingPaneLayoutandFragmentsActionbarInthispost,wewanttoshowhowtouse SlidingPaneLayout .Thisisaninterestingcomponentthatcanbeusedwhenwewanttohaveamulti-panehorizo...

4.2编辑框

发布时间:2022-11-08 JAVA ANDROID 开发语言
一、编辑框常用属性text:文本框的文本内容maxLines:最大行数lines:行数inputType:输入数据类型hint:提示textColor:文本颜色textSize:文本字号textColorHint:提示文本颜色singleLine:文本是否单行(true,false)二、案例实现一、涉及知识点线性布局(LinearLayout)标签(TextView)编辑框(EditText)按钮...

ubantu-16+ndk-r14b 编译 ffmpeg-4.0.2+lame_mp3-3.99.5

发布时间:2018-07-25 NDK ANDROID LAMEMP3 FFMPEG
1、环境和软件版本ubantu-16.4.1ndk-r14bffmpeg-4.0.2lame_mp3-3.99.52、废话  因为我也是新手,对linux不熟悉,对编译不熟悉,最喜欢的动作就是拿来主义,研究不深,所以不敢保证本文所有的操作都是一步到位没有问题,再者,即使跑不通,也可以给大家提供个思路。  根据我上一篇博客(https://my.oschina.net/u/1462828/blog/...

深入浅出Android makefile(3)--LOCAL_SRC_FILES

发布时间:2015-08-11 ANDROID MAKEFILE
讨论完LOCAL_PATH,我们紧接着来看看LOCAL_SRC_FILES。一、LOCAL_SRC_FILESMakefile代码  LOCAL_SRC_FILES := acp.c  LOCAL_SRC_FILES变量的意思见名知意,很明显是用来记录当前模块的源文件列表的一个变量。这里是他的赋值,我们下面来看看他的使用的地方。在build/core/binary.mk中有如下的部分:Makefi...

Android 研究 Linux内核启动过程,Android框架启动过程

发布时间:2013-05-08 ANDROID
最近在博客园发现某博主收集的关于Android底层的文章,觉得很不错,所以记录下来。http://www.cnblogs.com/linucos/category/376967.html其中《Android研究-linux内核启动到android系统[zz]》和《Android研究-Android系统初始化程序init和初始化配置文件init.rc分析[zz]》最近研究一项在init进程中添加启动...

Android App开发即时通信中通过SocketIO在客户端与服务端间传输文本和图片的讲解及实战(超详细 附源码)

需要源码和服务端代码请点赞关注收藏后评论区留下QQ~~~一、通过SocketIO传输文本消息虽然HTTP协议能够满足多数常见的接口交互,但是他属于短连接,每次调用完就自动断开连接,并且HTTP协议区分了服务端和客户端,双方的通信过程是单向的,只有客户端可以请求服务端,服务端无法主动向客户端推送信息,所以它不适合点对点的即时通信功能即时通信技术需要满足两方面的要求。一是长连接,以便在两台设备之间持续...

Android Camera探究之路——起步

发布时间:2019-02-01 CAMERA ANDROID
                     AndroidCamera探究之路——起步Camera在手机中有着举足轻重的地位,不管是二维码还是照片、识别,都离不开摄像头,本文将对Android中的Camera进行全面解析。权限镇楼:&lt;uses-permissionandroid:name="android.permission.CAMERA"/&gt;&lt;uses-permissionan...

Android学习之Intent使用

发布时间:2016-03-03 ANDROID INTENT
1、使用显示IntentIntentintent=newIntent(FirstActivity.this,SecondActivity.class);startActivity(intent);上述代码的作用是打开活动SecondActivity2、使用隐式Intent首先打开AndroidManifest.xml,添加代码:&lt;activityandroid:name="com.examp...

Android studio 新版打包没有签名信,即解压apk文件在META-INF中没有CERT.RSA和CERT.SF

发布时间:2022-10-28 ANDROID STUDIO ANDROID IDE
主要原因是新版studio中去掉了第一步: 那么我们在build文件中进行配置一下第二步:重点!重点!重点!主要的点是在buildTypes中引用signingConfigsigningConfigs.release,很多人可能会忘记这一点。以上内容配置完之后重新打包就可以看到了 CERT.RSA和CERT.SF了,也就有了签名信息。...

android 消息推送机制之GCM(二)

发布时间:2015-12-30 ANDROID GCM
本文转载自http://blog.csdn.net/wzg_1987/article/details/9148023上一节讲了GCM方式实现前的一些必要准备工作,和消息接收的实现。这一节我们来讲一下发送消息的实现。上一节也已经讲了,GCM方式其实并不区分严格的客户端和服务端,对于开发者来说,任何一方都可以是客户端或者服务端,只要搭建的环境满足两个端的要求。也就是说,对于用户来说,可以既是发送方也可...

获得Android设备的唯一序列号

发布时间:2022-11-25 源码 ANDROID 系统信息
理论部分1、每个设备都有一个唯一序列号,Android设备也不例外,PC上用Mac地址实践部分1、核心代码:Secure.getString(getContentResolver(),Secure.ANDROID_ID);2、一个小案例: main.xml &lt;?xmlversion="1.0"encoding="utf-8"?&gt;&lt;LinearLayoutxmlns:android...

用eclipse 开发 android应用时出现个错误,“your project contains error(s),please fix them before running your application”

在用eclipse写Android程序的时候,一不小心运行了一下main.xml布局文件,结果自动生成了一个main.out.xml文件,删掉之后项目就出错了,还找不到是哪里出错。一运行就是“yourprojectcontainserror(s),pleasefixthembeforerunningyourapplication.” 找了找帖子,发现group中有一段话:不妨试试。Somethin...

service和thread的区别,何时用service,何时用thread?

发布时间:2016-09-21 ANDROID
按服务性质分localservice和remoteservice当它运行的时候如果是LocalService,那么对应的 Service是运行在主进程的 main 线程上的。如:onCreate,onStart 这些函数在被系统调用的时候都是在主进程的 main 线程上运行的,如果此时你在Service里编写了非常耗时的代码,程序必定会出现ANR的!当它运行的时候如果是Remote Service...

adb无法启动

发布时间:2015-12-16 ANDROID
转自:http://104zz.iteye.com/blog/1681183现象:adbshell时提示 adbserverisoutofdate. killing...ADBserverdidn'tACK*failedtostartdaemon*error:unknownhostservice原因:端口被占用方案:方法一:(1)查看任务管理器,关闭所有adb.exe,或者运行-&gt;cmd,在...

解决ADB server didn't ACK问题,连上手机问题

发布时间:2015-07-26 ANDROID
出现如下情况ADBserverdidn'tACK*failedtostartdaemon*解决办法:方法一:(1)查看任务管理器,关闭所有adb.exe,或者运行-&gt;cmd,在命令窗口输入adbkill-server(2)重启eclipse即可方法二,:如果方法一不行,就查看下自己电脑是否启动了如:91手机助手,360手机 豌豆荚等先把他关闭,重新连接试试,再不行就卸载这些软件应该可以解决。...

如何在真机上调试Android应用程序(图文详解)(zz)

发布时间:2015-05-18 ANDROID ZZ
http://www.cnblogs.com/lanxuezaipiao/archive/2013/03/11/2953564.html 1、首先将手机设置为调试模式方法:设置——应用程序——开发——USB调试,打上√即可  2、用数据线连接至电脑,在电脑上安装豌豆荚,此时豌豆荚会帮你安装驱动,安装好后豌豆荚就可以连接上手机了 3、用adb命令测试是否有装置已连接命令:adbdevices看到已经...

AsyncTask异步任务

发布时间:2013-11-01 ANDROID
AsyncTask异步任务怎么写写一个类继承AsyncTask,重写方法doInBackgroud再new这个类,执行对象.execute()在UI线程里面写这个类的实现方法doInBackground有可能是新开的线程,有可能是线程池里面的线程执行顺序:onPreExecute之后执行doInBackground之后onPostExecuteonPreExecute和onPostExecute在...

百度地图:标注驾车路线搜索

发布时间:2013-11-02 百度地图 ANDROID
在http://blog.csdn.net/lj102800/article/details/13998543基础上添加 //实例化地图的查询类 mkSearch=newMKSearch(); mkSearch.init(bMapManager,newMySearchListener()); //给起始点构建一个坐标 start=newMKPlanNode(); start.pt=...

XML的序列化

发布时间:2013-11-12 ANDROID
publicclassXmlextendsActivity{ privateList&lt;SmsInfo&gt;smsInfos; @Override protectedvoidonCreate(BundlesavedInstanceState){ //TODOAuto-generatedmethodstub super.onCreate(savedInstanceState); set...

腾讯微博客户端开发

发布时间:2013-10-31 ANDROID
1.申请开发资质2.学习API文档3.学习Oauth认证机制4.编写设计文档5.代码编写1.创建无线应用地址http://dev.t.qq.com/apps/add/6,创建后可以获得AppKey和AppSecret2.:Oauth,的工作原理什么是Oauth1&gt;Oauth是完整的安全认证的协议2&gt;Oauth协议为用户资源的授权提供了一个安全的、开放而又简易的标准3&gt;Oauth的...

Android Jetpack之ViewModel的使用及源码分析

ViewModel类是一种业务逻辑或屏幕级状态容器。它用于将状态公开给界面,以及封装相关的业务逻辑。它的主要优点是,它可以缓存状态,并可在配置更改后持久保留相应状态。这意味着在activity之间导航时或进行配置更改后(例如旋转屏幕时),界面将无需重新提取数据。现在,常用的项目架构,在MVP向MVVM转变。相对于MVP中的P(presenter),MVVM中的ViewModel有哪些优势呢。Vie...

Android中如何让DialogFragment全屏(DialogFragment fullscreen)

发布时间:2015-02-16 ANDROID ANDROID DIALOG ANDROID FRAGMENT
From:http://www.cnblogs.com/yejiurui/p/3615992.html这个问题很让人纠结,因为我要在popopwindows里面使用fragment,但是在popopwindows里面找不到它的父控件,于是转战使用DialogFragment,但是让它全屏是一件很头疼的事情,找了好久总于找到,分享给需要的朋友记着要在DialogFragment的oncreate里面...

android:TableLayout表格布局详解

这篇博文包括的内容:1、TableLayout简介2、TableLayout行列数的确定3、TableLayout可设置的属性详解4、一个包含4个TableLayout布局的实例及效果图一、Tablelayout简介     Tablelayout类以行和列的形式对控件进行管理,每一行为一个TableRow对象,或一个View控件。     当为TableRow对象时,可在TableRow下添加子...

安卓开发记录-2022.11.21

发布时间:2022-11-21 ANDROID
接着安卓多activity共用socket遇到的问题_yangyihuaabx的博客-CSDN博客继续研究多activity共用一路socket的问题。本来想直接把文章多个Activity之间共用一个Socket实例_lhp15575865420的博客-CSDN博客里面的例子改一改直接用,发现用不了。因为我本来的老代码里面用的是udp,也就是DatagramSocket类,但是这个例子用的是soc...

Android开发(java基础)HashMap存储结构及扩容

发布时间:2018-01-21 JAVA ANDROID
之前有写过ArrayList与LinkedList,分别用到了数组与链表的结构,下面来看看HashMap,了解其实现及扩容机制。构造函数HashMap有四个构造函数,其中比较有代表性的是下面这个publicHashMap(intinitialCapacity,floatloadFactor){if(initialCapacity&lt;0)thrownewIllegalArgumentExcept...