Android应用界面开发_学习笔记_第一周

二、AS报错“ADB not responding. if you’d like to retry…”

安装好AS开发环境 以及 genimotion模拟器,运行最简单的android程序时,报如下错误:

这里写图片描述

百度搜索“ADB not responding. If you’d like to retry…”等搜索结果都说是adb运行的端口号(5037)被占用导致的,需要kill掉占用5037端口的进程,但是kill 进程时发现模拟器一直占用5037端口,无法解决这个问题。

然后在stackoverflow上搜索终端报错的message:“adb server is out of date. killing…”,问题得到解决。

问题的原因是:在Genimotion的Settings中,默认使用genimotion自带的sdk,和android sdk冲突了,要手动更改为如下图所示。重启genimotion,就可以运行android studio啦。

(stackoverflow问题地址为:http://stackoverflow.com/questions/5092542/adb-server-is-out-of-date/26763766#26763766)

这里写图片描述

三、签名 & 打包 修改版本号

Build –> Generate Signed APK –>next …

点击create new key store,填写如下信息:

这里写图片描述

版本号为 1.0.0

build.gradle里修改versionName“1.0.0”
设置好后,可通过模拟器、设置、应用,查看版本号。

四、布局属性

以下部分内容参考他人博客

RelativeLayout用到的一些重要的属性:

第一类:属性值为true或false 
android:layout_centerHrizontal  水平居中 
 android:layout_centerVertical   垂直居中 
android:layout_centerInparent    相对于父元素完全居中 
android:layout_alignParentBottom 贴紧父元素的下边缘 
android:layout_alignParentLeft   贴紧父元素的左边缘 
android:layout_alignParentRight  贴紧父元素的右边缘 
android:layout_alignParentTop    贴紧父元素的上边缘 
android:layout_alignWithParentIfMissing  如果对应的兄弟元素找不到的话就以父元素做参照物 

第二类:属性值必须为id的引用名“@id/id-name” 
android:layout_below      在某元素的下方 
android:layout_above      在某元素的的上方 
android:layout_toLeftOf   在某元素的左边 
android:layout_toRightOf  在某元素的右边 

android:layout_alignTop   本元素的上边缘和某元素的的上边缘对齐 
android:layout_alignLeft  本元素的左边缘和某元素的的左边缘对齐 
android:layout_alignBottom 本元素的下边缘和某元素的的下边缘对齐 
android:layout_alignRight  本元素的右边缘和某元素的的右边缘对齐 

第三类:属性值为具体的像素值,如30dip,40px 
android:layout_marginBottom              离某元素底边缘的距离 
android:layout_marginLeft                离某元素左边缘的距离 
android:layout_marginRight               离某元素右边缘的距离 
android:layout_marginTop 离某元素上边缘的距离 

注: android:layout_marginTop 离某元素上边缘的距离

1、如果上方有组建就是指该组件,该组建就会在上面那个组建的下面;
2、android:layout_alignTop=”@id/某个组件”,该组建就在这个组件的上面了,然后再距离这个多少距离就好了

EditText的android:hint

设置EditText为空时输入框内的提示信息。

android:gravity 

android:gravity属性是对该view 内容的限定.比如一个button 上面的text. 你可以设置该text在view的靠左,靠右等位置.

android:layout_gravity

android:layout_gravity是用来设置该view相对于父view 的位置.

android:layout_alignParentRight

使当前控件的右端和父控件的右端对齐。这里属性值只能为true或false,默认false。

android:scaleType:

android:scaleType是控制图片如何resized/moved来匹对ImageView的size。ImageView.ScaleType/ android:scaleType值的意义区别:

CENTER /center 按图片的原来size居中显示,当图片长/宽超过View的长/宽,则截取图片的居中部分显示
CENTER_CROP / centerCrop 按比例扩大图片的size居中显示,使得图片长(宽)等于或大于View的长(宽)
CENTER_INSIDE / centerInside
将图片的内容完整居中显示,通过按比例缩小或原来的size使得图片长/宽等于或小于View的长/宽
FIT_CENTER / fitCenter 把图片按比例扩大/缩小到View的宽度,居中显示
FIT_END / fitEnd 把图片按比例扩大/缩小到View的宽度,显示在View的下部分位置
FIT_START / fitStart 把图片按比例扩大/缩小到View的宽度,显示在View的上部分位置
FIT_XY / fitXY 把图片不按比例扩大/缩小到View的大小显示
MATRIX / matrix 用矩阵来绘制,动态缩小放大图片来显示。

** 要注意一点,Drawable文件夹里面的图片命名是不能大写的。

五、setOnClickListener三种实现方法

以下部分内容参考其他blog

1)第一种,也是最长见的添加方法(以Button为例)

        mButton = (Button)findViewById(R.id.splash_button);
        mButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(SplashActivity.this,MainActivity.class);
                startActivity(intent);
            }
        });

2)第二种,这个方法较前一种稍微简单了一些,允许多个Buttons共享一个Listener。通过Switch控制对不同Button Click事件的响应方法:

package com.example.chenjinhua.gbanddemo;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {
    private Button mButtonFirst;

    private View.OnClickListener mOnclickListener = new View.OnClickListener() { //创建监听对象
        @Override
        public void onClick(View view) {
            switch (view.getId()){
                case R.id.button_first:
                    Intent intent = new Intent(MainActivity.this,SplashActivity.class);
                    startActivity(intent);
                    break;
            }
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mButtonFirst = (Button)findViewById(R.id.button_first);
        //第二种方法
        mButtonFirst.setOnClickListener(mOnclickListener);  //设置监听
    }
}

3)第三种,直接将Clicklistener捆绑XML layout中的Views元素,在程序中定义的Listener方法需要带有一个View类型的参数:

定义符合如下 参数返回值函数 并将 方法名字符串指定为该属性值 即可:

public void onClickButton(View view) //Activity里函数

android:onClick=“onClickButton” //layout里属性值

 <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/button_third_text"
        android:id="@+id/button_third"
        android:onClick="first_chapter" //设置该属性值
        />
//第三种方法,本例子中,没有使用Button的监听器监听按钮动作。点击按钮就会调用如下方法。
    public void first_chapter(View view){
        Intent intent = new Intent(MainActivity.this,NextActivity.class);
        startActivity(intent);
    }

该种方法,当有多个按钮时,可这样实现:

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/button_third_text"
        android:id="@+id/button_third"
        android:layout_below="@+id/button_second"
        android:onClick="onClick" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/button_third"
        android:text="New Button"
        android:id="@+id/button_fourth"
        android:onClick="onClick" />

//设置多个button的属性值相同

java代码:

   //同一个函数名
    public void onClick(View view){
        switch (view.getId()){
            case R.id.button_third:
                Toast.makeText(this,"第三个页面",Toast.LENGTH_SHORT).show();
            case R.id.button_fourth:
                Toast.makeText(this,"第四个页面",Toast.LENGTH_SHORT).show();
                break;
        }
    }

粗略总结:
1、按钮少的时候用匿名内部类会比较快,比如写demo测试的时候或者登陆界面之类的。
2、按钮多的情况我还是选择第二种方法,方便。
3、第三种方法,我感觉最方便,但看了很多代码还是觉得写法不够大众化,感兴趣的朋友可以对此研究研究。相信会有不少收获。

六、闪屏页面3秒后自动进入主页,闪屏和主页来回传递数据

1、Handler定时做某事(如跳转), Handler.postDelayed(runnable,time)

        //首先创建一个Handler对象
        Handler handler = new Handler();
        //使用postDelayed方法,两秒后调用Runnable对象,实际上实现了一个3秒的定时器
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                //定时时间到了以后,将要做的事
            }
        },3000);
    }

2、startActivity传送数据

(1)、Activity跳转时传递所有数据类型,以及对象;
(2)、传递对象,首先要对对象序列化,序列化就是可传的对象,序列化其实就是一个组装。

  //序列化
public class UserInfo implements Serializable{
    private String mUserName;
    private int mAge;
 intent.putExtra("UserInfo", userInfo);
 startActivity(intent);
 Intent intent = getIntent();
        if (intent != null) {
            UserInfo userInfo = (UserInfo)intent.getSerializableExtra("UserInfo");
            setTitle("名字是" + userInfo.getmUserName());
        }

3、startActivityForResult、setResult

1、如果想在Activity中得到新打开Activity关闭后返回的数据,需要使用系统提供的startActivityForResult(Intent intent, int requestCode)方法打开新的Activity,新的Activity关闭后会向前面的Activity传回数据,为了得到传回的数据,必须在前面的Activity中重写onActivityResult(intrequestCode, int resultCode, Intent data)方法。

2、实现: SplashActivity.java 为页面1,MainActivity.java
为页面2,要从页面1启动页面2,页面2收到页面1发来的数据干完活之后,按按键OK会把结果汇报给页面1,同时自己关闭,返回到页面1。

注意:复写OnActivityResult方法时,不需要再新建Intent,onActivityResult有三个参数,第三个参数就是Intent,只需要用他做参数就行了。

4、写程序时不要直接有String字符串“xxxx”,用command+option+c 提取为全局常量,然后常量在类里面就直接用,不在本类就用:类名.常量名引用。

intent.putExtra(SPLASH_TEXT,title);
//这里的SPLASH_TEXT即提取出来的常量。

5、Log方法里将字符串TAG声明为主页的名字。

private static final String TAG = MainActivity.class.getSimpleName();
//Log方法里将TAG声明为主页的名字“类名.getSimpleName()”

闪屏页面3秒后自动进入主页,闪屏和主页来回传递数据,代码实现

SplashActivity代码:

package com.example.chenjinhua.datatransfer;

import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.widget.TextView;

/**
 * Created by chenjinhua on 16/2/25.
 */
public class SplashActivity extends AppCompatActivity{
    public static final String SPLASH_TEXT = "splash_text";
    public static final String MAIN_TEXT = "main_text";
    TextView splash_textView;
    public static final int REQUEST_CODE = 1234;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.layout_splash);

        splash_textView = (TextView) findViewById(R.id.splash_textView);
        final String title = splash_textView.getText().toString();

        //首先创建一个Handler对象
        Handler handler = new Handler();
        //使用postDelayed方法,两秒后调用Runnable对象,实际上实现了一个3秒的定时器
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                Intent intent = new Intent(SplashActivity.this,MainActivity.class);
                intent.putExtra(SPLASH_TEXT,title);
                startActivityForResult(intent, REQUEST_CODE);
            }
        },3000);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == REQUEST_CODE && resultCode == MainActivity.RESULT_CODE){
            String splash_tv = data.getStringExtra(MAIN_TEXT);
            splash_textView.setText(splash_tv);
        }
    }
}

MainActivity代码:

package com.example.chenjinhua.datatransfer;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    public static final int RESULT_CODE = 9999;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        final Intent intent = getIntent();
        if (intent != null){
            String title = intent.getStringExtra(SplashActivity.SPLASH_TEXT);
            setTitle(title);
        }


        Button button = (Button) findViewById(R.id.button_mainactivity);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent1 = new Intent(MainActivity.this,SplashActivity.class);
                intent1.putExtra(SplashActivity.MAIN_TEXT,"我是主页,我送礼回来了");
                setResult(RESULT_CODE, intent1);
                finish();
            }
        });
    }
}

注意:
1、匿名内部类中想要使用String 类型,需要将其定义为final,确保使用过程中值不会改变。
2、获取到了Textview时,必须确保值转换为String类型,这样就需要用到.toString()
3、传递对象时,需要先将对象进行implements Serializable序列化操作;接收的Activity在收到对象时,需要强转和对象一致的类型
4、intent接收时一定要判断结果为空的情况,避免出现异常。

七、Activity生命周期

参考博客 http://blog.csdn.net/liuhe688/article/details/6733407

八、AS插件

1、Genymotion
2、ADB
3、markdown

安装方法: preference –搜索plugins –Browser repositories –
分别搜索genymotion、ADB、markdown等。

1、Genymotion安装后启动时报错,问题以及解决方法为:

http://stackoverflow.com/questions/28252690/android-studio-you-must-specify-a-path-to-genymotion-folder-to-use-this-feuture

2、启动ADB的快捷键为:command +shift + a,然后输入adb。

九、常用控件 和 .9图

android:ems = “10” 设置TextView或者Edittext的宽度为10个字符的宽度。当设置该属性后,控件显示的长度就为10个字符的长度,超出的部分将不显示。只有在 android:layout_width=“wrap_content” 时,才会显示;如果是 android:layout_width=“match_parent” 时,则不会有变化。

.9图

drawable – 右键 create 9_patch file。

ImageView

ImageView中 android:src属性 android:background属性的区别:

1、background会根据ImageView组件给定的长宽进行拉伸,而src就存放的是原图的大小,不会进行拉伸。src是图片内容(前景),bg是背景,可以同时使用。

2、此外:scaleType只对src起作用;background可设置透明度。

注意:控制的图片为资源而不是背景,即android:src=”@drawable/pic”,而非android:background=”@drawable/pic”。程序中动态加载图片也类似,如:应该imgView.setImageResource(R.drawable.);而非imgView.setBackgroundResource(R.drawable.)。

十、AS打开别人的项目

1、将他人项目下载到本地(路径中不包含中文);

2、修改compileSdkVersion 和buildToolsVersion版本:
用Sublime打开app/build.gradle 修改为自己本地安装的版本

 compileSdkVersion 23
 buildToolsVersion "21.1.2"

 minSdkVersion 15

3、修改gradle的版本:用Sublime打开gradle/wrapper/gradle-wrapper.properties

distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip

4、修改好后,AS — File — Open 保证文件夹只有一级

MissGuo/MissGuo/app、build等文件,这是不行的;
应该是MissGuo/app、build等文件。

5、版本正确,但MainActivity还是爆红,可以把MainActivity改成继承自Activity。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值