AS gradle:peer not authenticated,install_failed_no_matching_abis

1、错误抛出:peer not authenticated
多半是你下载的项目里gradle.build里面的
dependencies {
classpath ‘com.android.tools.build:gradle:1.3.0’
}
这里的gradle的版本与你本机实质使用的不一样,最好新建一个看一下系统版本。
我遇到的这个问题是,下载下来的项目gradle:1.0.0
我的实际是1.3.0
修改之后,就没有再报peer not authenticated了,并且ok了。
2、在android模拟器上运行apk时报错:install_failed_no_matching_abis
在stackoverflow上面的一个答案:
INSTALL_FAILED_NO_MATCHING_ABIS is when you are trying to install an app that has native libraries and it doesn’t have a native library for your cpu architecture. For example if you compiled an app for armv7 and are trying to install it on an emulator that uses the Intel architecture instead it will not work.
解决方法:
If you using Genymotion you need Installing ARM Translation and GApps

Fragment 实现底部导航栏

把用户体系相关的功能实现完成后,需要进入app内容了。

我有4个底部导航栏,如果像之前一样,通过到不同的activity,感觉有点傻,全放在一个activity里面更换内容的话,就显得有点挤,很难管理。这个时候fragment进入了我的视野。发现它是一个神器。

可以把Fragment当成Activity的一个界面的一个组成部分,甚至Activity的界面可以完全有不同的Fragment组成,更好的是Fragment拥有自己的生命周期和接收、处理用户的事件,这样就不必在Activity写一堆控件的事件处理的代码了。更为重要的是,你可以动态的添加、替换和移除某个Fragment。

关于fragment的生命周期可以参考一下:http://blog.csdn.net/forever_crying/article/details/8238863/

直接说一下我怎么实现这个底部导航栏的吧,之后做完了,想尝试下第一次去github上开个源..

首先,

activity的布局文件:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <FrameLayout
        android:id="@+id/id_content"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_above="@+id/id_bottombar"
        />

    <include
        android:id="@+id/id_bottombar"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        layout="@layout/bottom_bar" />
</RelativeLayout>

分为两部分:一个是导航栏,一个是内容区
这样子设计后,大家可以自行完成bottom_bar的布局(线性,水平n分布,n是你的导航个数)

mainActivity.java关键实现:

初始化:(我只举了两个例子)

RadioButton tabAboutme;
RadioButton tabOnlinechat;
private meFragment aboutMe;
private chatFragment onlineChat;
// 初始化控件和声明事件
tabAboutme = (RadioButton) findViewById(R.id.aboutMe);
tabOnlinechat = (RadioButton) findViewById(R.id.onlineChat);
tabAboutme.setOnClickListener(this);
tabOnlinechat.setOnClickListener(this);
// 设置默认的Fragment
setDefaultFragment();

//我这里取的是 我的 界面。
private void setDefaultFragment()
{
    FragmentManager fm = getFragmentManager();
    FragmentTransaction transaction = fm.beginTransaction();
    aboutMe = new meFragment();
    transaction.replace(R.id.id_content, aboutMe);
    transaction.commit();
}
// 对当前类实现了onclick接口(implements View.OnClickListener)
@Override
public void onClick(View v)
{
 FragmentManager fm = getFragmentManager();
 // 开启Fragment事务
 FragmentTransaction transaction = fm.beginTransaction();

 switch (v.getId())
 {
 case R.id.aboutMe:
 if (aboutMe == null)
 {
 aboutMe = new meFragment();
 }
 // 使用当前Fragment的布局替代id_content的控件
 transaction.replace(R.id.id_content, aboutMe);
 break;
 case R.id.onlineChat:
 if (onlineChat == null)
 {
 onlineChat = new chatFragment();
 }
 transaction.replace(R.id.id_content, onlineChat);
 break;
 }
 // transaction.addToBackStack();
 // 事务提交
 transaction.commit();
}

最后是实现我的Fragment类们,这里只举了meFragment (aboutMe对应的):

package com.hbox.hdoctordoc.main_activity;

import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.hbox.hdoctordoc.R;

/**
 * Created by qing on 9/27/15.
 */
public class meFragment extends Fragment{
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState)
    {
        return inflater.inflate(R.layout.me_fragment, container, false); // 指定这个tab下对应的视图
    }
}

其他的实现都差不多,等过几天开源了再贴地址了。

android实现登陆界面

很多应用都会有一个启动界面。欢迎画面慢慢隐现,然后慢慢消隐。实现这种效果的方法可能有很多,说下我使用的,觉得比较方便简单的方法:使用两个Activity,程序启动时候load第一张Activity,然后由tick触发N秒钟后startActivity另外一张Activity。

两张activity(splash.java, loginActivity.java)自己建立,我就说下登陆那个界面的逻辑代码:

package com.hbox.hdoctordoc;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;

public class splash extends Activity {

    private final int SPLASH_DISPLAY_LENGHT = 3000; //延迟三秒

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.splash);
        new Handler().postDelayed(new Runnable(){

            @Override
            public void run() {
                Intent mainIntent = new Intent(splash.this, loginActivity.class);
                splash.this.startActivity(mainIntent);
                splash.this.finish();
            }

        }, SPLASH_DISPLAY_LENGHT);
    }
}

AS导入第三方库

初涉安卓,本来想用eclipse,但是貌似android studio是官方推崇的,故入坑..

导入第三方库,

1、先从android切换到project,

step1

2、然后新建一个libs的目录。

step2

3、copy你所有要导入的jar到libs目录下

step3

4、右键它们,选择add to library,done

 

其他:

鉴于你导入的包里面都含有meta-inf,可能被重复打包,然后提示你duplicate的错误,解决方法如下:

在你app下的build.gradle下,android部分添加:

    packagingOptions{
        exclude 'META-INF/LICENSE.txt'
        exclude 'META-INF/NOTICE.txt'
    }
    lintOptions {
        abortOnError false
    }

Android – 各种尺寸的关联

1、概述

过去,我们通常以像素为单位设计计算机用户界面。例如:图片大小为80×32像素。这样处理的问题在于,如果在一个每英寸点数(dpi)更高的新显示器上运行该程序,则用户界面会显得很小。在有些情况下,用户界面可能会小到难以看清内容。由此我们采用与分辨率无关的度量单位来开发程序就能够解决这个问题。Android应用开发支持不同的度量单位。

2、度量单位含义

      dip: device independent pixels(设备独立像素). 不同设备有不同的显示效果,这个和设备硬件有关,一般我们为了支持WVGA、HVGA和QVGA 推荐使用这个,不依赖像素。

     dp: dip是一样的

     px: pixels(像素). 不同设备显示效果相同,一般我们HVGA代表320×480像素,这个用的比较多。

     pt: point,是一个标准的长度单位,1pt=1/72英寸,用于印刷业,非常简单易用;
sp: scaled pixels(放大像素). 主要用于字体显示best for textsize。

    in(英寸):长度单位。
mm(毫米):长度单位。

3、相关联系

dip = 一英寸上有多少像素点

拿google的nexus 5来说明,官方给的参数是1920*1080, 445dpi, 4.9 inc(对角线长度)

则dip的计算方式为:

sqrt(1920^2+1080^2)/4.95

而我们定义1dp = (实际dpi/160dpi) px

之所以用dp可以解决屏幕的适配问题,是因为使用dp则显示的不再是写死的像素,dpi高一点的设备的dp=更多的像素,如果一个320px屏幕的dpi为160,另一个480px的屏幕dpi为240,则前一个设备1dp=1px,后一个设备1dp=1.5px,所以如果我们设置某条线的宽度为320dpi的话,则这根线在两个设备上都是横穿整个屏幕的。如果使用像素,则第二个设备的屏幕只有2/3被我们的线覆盖。

sp适合我们用在文字的现实,是根据文字首选项大小来进行缩放的一种尺寸亮度。常用12sp, 14sp, 18sp ,22sp

附:mdpi/hdpi/xhdpi/xxhdpi/xxxhdpi的范围:

dpis

RadioGroup & RadioButton

RadioGroup

提供多选一,多个radiobutton的集合

属性:

Android:orientation=”vertical” , “horizontal” (垂直排布、水平排布)

<RadioGroup

android:id=”@+id/radiogroup”

android:layout_width=”match_parent”

android:layout_height=”match_parent”

android:layout_below=”@+id/checkBox”

android:layout_alignParentLeft=”true”

android:orientation=”horizontal”

android:layout_alignParentStart=”true”>

<RadioButton

android:layout_width=”wrap_content”

android:layout_height=”wrap_content”

android:text=”

android:id=”@+id/radioButton”/>

<RadioButton

android:layout_width=”wrap_content”

android:layout_height=”wrap_content”

android:text=”

android:id=”@+id/radioButton2″/>

</RadioGroup>

Private RadioGroup rg;

rg=(RadioGroup)findViewById(R.id.radiogroup);

rg.setOnCheckedChangeListener(newRadioGroup.OnCheckedChangeListener(){

Stringcont;

@Override

Public void onCheckedChanged(RadioGroupgroup,intcheckedId){

switch(checkedId){

caseR.id.radioButton:

cont=”“;

break;

caseR.id.radioButton2:

cont=”“;

break;

default:

break;

}

Toast.makeText(MainActivity.this,”您选择的是“+cont,Toast.LENGTH_SHORT).show();

}

});

Togglebutton&checkbox

togglebutton

有两种状态:选中和为选中,比如开与关
属性:android:checked = “true”
Android:textoff=”关” –checked=”false”(对应状态)
Android:texton=”开” — checked=”true”

 

增加一个图片来看看点击切换图片的效果

tb=(ToggleButton)findViewById(R.id.toggleButton);
img=(ImageView)findViewById(R.id.imageView2);
/*
*给当前的tb设置监听器
**/
CompoundButton.OnCheckedChangeListenerlistener=newCompoundButton.OnCheckedChangeListener(){
@Override
publicvoidonCheckedChanged(CompoundButtonbuttonView,booleanisChecked){
if(true==isChecked){
img.setBackgroundResource(R.mipmap.add);
isChecked=false;
}else{
img.setBackgroundResource(R.mipmap.delete);
isChecked=true;
}
}
};
tb.setOnCheckedChangeListener(listener);

复选框 checkbox

两种状态:(checked)
1、选中(true) 2、未选中(false)
//初始化
Private CheckBox cb1,cb2,cb3;
cb1=(CheckBox)findViewById(R.id.checkBox);
cb2=(CheckBox)findViewById(R.id.checkBox2);
cb3=(CheckBox)findViewById(R.id.checkBox3);

//外部check监听类
CompoundButton.OnCheckedChangeListener checkedlistner=newCompoundButton.OnCheckedChangeListener(){
@Override
Public void onCheckedChanged(CompoundButtonbuttonView,booleanisChecked){
if(true==isChecked){
Stringchekedcontent=buttonView.getText().toString();
Toast.makeText(MainActivity.this,”您选择了”+chekedcontent,Toast.LENGTH_SHORT).show();
}
}
};
//绑定监听事件
cb1.setOnCheckedChangeListener(checkedlistner);
cb2.setOnCheckedChangeListener(checkedlistner);
cb3.setOnCheckedChangeListener(checkedlistner);

Android 自动补全控件

AutoCompeleteTextView

动态匹配输入的内容,如百度搜索引擎当输入文本时可以根据内容显示匹配的热门信息。

<AutoCompleteTextView

android:id=”@+id/autocom”

android:layout_width=”match_parent”

android:layout_height=”wrap_content”

android:layout_below=”@+id/button”

android:layout_alignParentLeft=”true”

android:layout_alignParentStart=”true”

android:hint=”@string/abc_search_hint”

android:completionThreshold=”2″ //输入了两个就开始检索

/>

第一步:初始化

privateAutoCompleteTextViewactext;

actext=(AutoCompleteTextView)findViewById(R.id.autocom);

第二步:需要一个适配器

ArrayAdapter<String>adapter=newArrayAdapter<String>(this,android.R.layout.simple_list_item_1,res);

第三步:初始化数据元--给文本框输入匹配的内容

privateString[]res={“sichuan”,”chengdu”,”ching”,”zhu”};

第四步:将adapter与当前AutoCompleteTextview绑定

Actext.setAdapter(adapter);

MultiAutoCompeleteTextView

可支持选择多个值(在多次输入的情况下),分别用分隔符分开,并且在每个值选中的时候再次输入值时会去自动匹配,可用在发短信,发邮件时选择联系人这种类型。

<MultiAutoCompleteTextView

android:layout_width=”wrap_content”

android:layout_height=”wrap_content”

android:id=”@+id/multiAutoCompleteTextView”

android:layout_below=”@+id/autocom”

android:layout_centerHorizontal=”true”

android:layout_marginTop=”64dp”

android:hint=”@string/abc_search_hint”

/>

与autocompletetextview其他都一样,只需要注意设置分隔符即可。

1、初始化

mactext=(MultiAutoCompleteTextView)findViewById(R.id.multiAutoCompleteTextView);

2初始化适配器…(这里我使用的上面那个)

3、绑定适配器

mactext.setAdapter(adapter);

设置分隔符

mactext.setTokenizer(newMultiAutoCompleteTextView.CommaTokenizer());

//设置了逗号分隔符

Android 按钮与点击事件

按钮

buttonimagebutton

buttontext属性,可以填写文本内容,可以用background添加背景

imagebutton不可以有文本内容,但可以引入图片内容(backgroundsrcbakcground需要drawable引入)

产生click事件

onClick事件

1buttonimagebutton都拥有一个onclick事件

通过自身的.setOnClickListener(OnClickListener)方法添加点击事件

2、所有控件都有一个onclick事件

监听事件实现的几种写法

1、匿名内部类

适合个别点击事件单独写

a、初始化当前所需要控件。

Private Button mybtn;

Mybtn = (Button) findViewById(R.id.button);

b、绑定动作,设置button的监听器,通过监听器实现点击button要操作的事情。

Mybtn.setOnClickListener(new OnClickListener(){

@Override

publicvoidonClick(Viewv){

//在当前ONCLICK方法中监听点击BUTTON的动作

System.out.println(“mybuttonwasclicked”);

}

});

2、独立类(外部类)实现

可以完成对一类按钮,涉及点击事件的统一设定提示等功能

示例:

mybtn2=(ImageButton)findViewById(R.id.imageButton);

mybtn2.setOnClickListener(newMyOnClickListener(){

@Override

publicvoidonClick(Viewv){

super.onClick(v);

Toast.makeText(MainActivity.this,”hello”,Toast.LENGTH_SHORT).show();

}

});

class MyOnClickListener implements View.OnClickListener{

@Override

publicvoidonClick(Viewv){

//让所有使用当前外部类的点击事件按钮都要执行这个动作

v.setAlpha((float)0.5);

}

}

3、实现接口的方式来实现

实现了整个activity涉及onclick的方法

示例:

Public class MainActivity extends AppCompatActivity implements View.OnClickListener{

@Override

Public void OnClick(View V){

//something…

}

}

即实现OnClickListener接口,进行setOnClickListener(this)绑定。

win7 jdk + eclipse + ant + android sdk + phonegap corvoda

帮朋友做一个基于android的玩意儿交差…自然想到用前端方法写了之后封装,比较快..

本想以后来鼓捣的,现在就当提前了..

现在在实习,只能利用休息时间来做做。

实习的时候带的mac出来的,在虚拟机下操作真心还是比不上win7真机..

分辨率看的各种不爽。。好了,不废话了。。来点实际的。

1. 安装jdk,之前我有篇在java分类下的帖子专门说了怎么安装jdk然后配置环境。可以先看下那篇文章。

2. eclipse – ANT,我下的luna,虽然其实只是用来装下ant。。

google的源基本用不了,各位还是离线安装吧,

其实操作还是一样,只是我们不用google那个source,直接先在网上找好jar拖进去

操作:帮助-安装新文件-添加(名称随意,位置通过 ARCHIVE-找到你下载的antxxx.zip)

8A5C0C39-D762-4F2B-9A3C-E24BB4BBCA77

 

 

3. 怎么搭建安卓环境(这个将重点说,尽量说明白,不然很坑..)

需要Android\android-sdk目录下的:

onepic

platforms, platform-tools, build-tools, system-images这几个目录下的包版本名一致,

其中platform-tools下面直接放你用的版本文件解压后的所有内容,不要加任何目录。

build-tools下的文件夹名以 19.0.1 这样的格式命名,这个也是我看一个寻找build文件的配置里面看见的,它是以这样的方式来查找的。

EXTRAS里面放support包.

workspace\phonegap\XXX(你生成的安卓项目名字)\platforms\android下的project.properties和workspace\phonegap\xxx\platforms\android\CordovaLib打开之后检查target的属性看下版本是否正确。

 

4. phonegap + cordova

这个很简单,网上都有很多教程,先装node.js,去官网就行。

然后进入命令行 (确定npm在path中), 分别:

npm install-g phonegap

npm install-g cordova

当然可能遇到安装失败,多半是源的问题,可以通过:

npm config set registry https://registry.npm.taobao.org 
npm info underscore (如果上面配置正确这个命令会有字符串response切换到淘宝的源,再安装,一般就没有问题了。

5.第一个cordova生成的apk文件
命令行cd到你想设定的工作目录,运行:

cordova create hello com.example.hello HelloWorld

运行:cd hello

运行:cordova platform add android 之后可以看到hello/platforms/android里出现Android项目。

运行:cordova build android 就会在/android/build/apk/outputs里面看到你导出的apk项目。

可能会遇到问题,就需要在第3步中设置好build-tools下面的命名规则,然后cordova生成的文件下有两个properties文件,把它们中间的 Android Target改为你sdk manager中可见到的最高的level即可。