孙肖宁 发布的文章

配置git

1.创建SSH Key
在用户的目录下,打开隐藏文件看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa和id_rsa.pub这两个文件,如果已经有了,可直接跳到下一步。如果没有,打开Shell(Windows下打开Git Bash),创建SSH Key:

ssh-keygen -t rsa -C "youremail@example.com"

你需要把邮件地址换成你自己的邮件地址,然后一路回车,使用默认值即可,也无需设置密码。
2.将ssh写入github
通过上述命令后将在windows中生成的id_rsa.pub文件,一般在C:\Users\windows用户名.ssh目录下,打开隐藏文件即可看到。复制出来,在github在点击头像,然后点击setting,在找到SSH and GPG keys,创建一个new ssh key,然后将刚刚复制的ssh key填入即可。
QQ截图20171014205505.png

QQ截图20171014205531.png

QQ截图20171014205552.png

3.验证是否连接成功
在终端输入(第一次输入yes)

ssh -T git@github.com

出现如下图所示的证明连接成功了
QQ截图20171014210046.png

4.设置username和email
为了确保上传到自己的github仓库,所以要设置用户名和自己的邮箱,通过以下命令

git config --global user.name "your name"
git config --global user.email "your_email@youremail.com"

题目:

读入一个自然数n,计算其各位数字之和,用汉语拼音写出和的每一位数字。

输入格式:每个测试输入包含1个测试用例,即给出自然数n的值。这里保证n小于10100。

输出格式:在一行内输出n的各位数字之和的每一位,拼音数字间有1 空格,但一行中最后一个拼音数字后没有空格。

输入样例:
1234567890987654321123456789
输出样例:
yi san wu

java参考答案:

    import java.awt.List;
    import java.util.HashMap;
    import java.util.Map;
    import java.util.Scanner;
    
    public class Main {
    
      public static void main(String[] args) {
        int sum = 0;
        
        Scanner sc = new Scanner(System.in);
        String s = sc.next();
        //把输入的字符串转换成字符数组
        char ch[] = s.toCharArray();
        //遍历数组
        for (char c : ch) {
          //求和:把字符数组中的字符先转换成字符串,在将字符串转成int类型
          sum += Integer.valueOf(String.valueOf(c));
        }
        //把和转换成字符串,载转换成字符数组
        char ch1[] = String.valueOf(sum).toCharArray();
        //定义一节集合,对应和中每个数字以及要输出的字符串
        Map<Character, String> m = new HashMap<>();
        m.put('0', "ling");
        m.put('1', "yi");
        m.put('2', "er");
        m.put('3', "san");
        m.put('4', "si");
        m.put('5', "wu");
        m.put('6', "liu");
        m.put('7', "qi");
        m.put('8', "ba");
        m.put('9', "jiu");
        //定义一个字符串,方便组拼输出结果(字符串)
        String sums=" ";
        //遍历由和转换的字符串数组
        for (char c : ch1) {
          //组拼字符串
          sums = sums+m.get(c)+" ";
          
        }
        //输出结果,去掉头和尾的空格
        System.out.print(sums.trim());
      }
    
    }

python2参考答案

#!/usr/bin/python
n = input()
l = ['ling', 'yi', 'er', 'san', 'si', 'wu', 'liu', 'qi', 'ba', 'jiu', 'shi']
s = str(n)
sum = 0
for i in s:
    sum += int(i)
sum_str = str(sum)
sum_sum = ''
for index, sum_i in enumerate(sum_str):
    sum_sum = sum_sum+l[int(sum_i)] if index == 0 else sum_sum+' '+l[int(sum_i)]
print sum_sum

创建数据库

package com.itheima.sqlite;


import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class MyOpenHelper extends SQLiteOpenHelper {
    /**
     * context  上下文
     * name:数据库的名字 
     * factory 目的创建cursor对象   
     * version 数据库的版本   从1开始
     */
    public MyOpenHelper(Context context) {
        super(context, "itheima.db", null,1);
    }

    /**
     * Called when the database is created for the first time.
     * 当数据库第一次创建的时候调用
     * 那么这个方法特别适合做表结构的初始化  创建表就是写sql语句
     */
    public void onCreate(SQLiteDatabase db) {

        db.execSQL("create table info(_id integer primary key autoincrement,name varchar(20),phone varchar(20))");
        
    }
    /**
     * Called when the database needs to be upgraded
     * 当数据库版本升级的时候调用 
     * 这个方法适合做   表结构的更新
     */
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

        db.execSQL("alter table info add phone varchar(20)");
        
    }

}

利用谷歌封装好的API对数据库进行增删改查

package com.itheima.sqlite;

import java.util.ArrayList;
import java.util.List;
import android.os.Bundle;
import android.provider.Contacts.Intents.Insert;
import android.app.Activity;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

import com.itheima.crud.R;

public class MainActivity extends Activity {

    private MyOpenHelper myOpenHelper;
    private List<Person> lists;
    private ListView lv;

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        //[0]找到lv
        
        lv = (ListView) findViewById(R.id.lv);
        
        myOpenHelper = new MyOpenHelper(getApplicationContext());
        
        
        //[1]定义一个集合用来存listview 要展示的数据 
        lists = new ArrayList<Person>();
        
        //打开或者创建数据库  如果是第一次就是创建   
                //SQLiteDatabase sqLiteDatabase = myOpenHelper.getWritableDatabase();
        //打开或者创建数据库  如果是第一次就是创建     如果磁盘满了 返回只读的
                //SQLiteDatabase readableDatabase = myOpenHelper.getReadableDatabase();
    
    }
    //点击按钮增加一条记录
    public void click1(View v){
        //[1]获取数据库对象
        SQLiteDatabase db = myOpenHelper.getWritableDatabase();
        //[2]执行增加一条的sql语句 
                //db.execSQL("insert into info(name,phone) values(?,?)", new Object[]{"张三","1388888"});
        /**
         * table 表名  
         * ContentValues 内部封装了一个map   key:  对应列的名字  value对应的值
         */
        ContentValues values = new ContentValues();
        values.put("name", "王五");
        values.put("phone", "110");
        //返回值代表插入新行的id 
        long insert = db.insert("info", null, values); //底层就在组拼sql语句
        //[3]数据库用完需要关闭
        db.close();
        
        if (insert>0) {
            Toast.makeText(getApplicationContext(), "添加成功", 1).show();
        }else {
            Toast.makeText(getApplicationContext(), "添加fail", 1).show();
        }
        
    }
    
    
    //删除
    public void click2(View v){
        SQLiteDatabase db = myOpenHelper.getWritableDatabase();
                //db.execSQL("delete from info where name=?", new Object[]{"张三"});
        //返回值代表影响的行数 
        int delete = db.delete("info", "name=?", new String[]{"王五"});
        db.close();

        Toast.makeText(getApplicationContext(), "删除了"+delete+"行", 0).show();
        
    }
    
    //更新 
    public void click3(View v){
        SQLiteDatabase db = myOpenHelper.getWritableDatabase();

               //db.execSQL("update info set phone=? where name=? ", new Object[]{"138888888","张三"});    
        ContentValues values = new ContentValues();
        values.put("phone", "114");
        //代表更新了多少行 
        int update = db.update("info", values, "name=?", new String[]{"王五"});
        db.close();
        
        Toast.makeText(getApplicationContext(), "更新了"+update+"行", 0).show();
    }
    
    
    //查找
    public void click4(View v){
        
        SQLiteDatabase db = myOpenHelper.getReadableDatabase();

        //columns 代表你要查询的列
        //selection 根据什么查询phone 
//        Cursor cursor = db.query("info", new String[]{"name","phone"}, "name=?", new String[]{"王五"}, null, null, null);
        Cursor cursor = db.query("info", null,null, null, null, null, null);

                //Cursor cursor = db.rawQuery("select * from info", null);
        if (cursor!= null&&cursor.getCount()>0) {
            while(cursor.moveToNext()){
                //columnIndex代表列的索引 
                String name = cursor.getString(1);
                String phone = cursor.getString(2);
                
                //把数据封装到javabean
                Person person = new Person();
                person.setName(name);
                person.setPhone(phone);
                
                //把javabena对象加入到集合
                lists.add(person);
                
            }
                    
            
        }
        
        
    }        
}

数据库的创建

定义一个类继承SQLiteOpenHelper

package com.itheima.sqlite;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class MyOpenHelper extends SQLiteOpenHelper {
    /**
     * context  上下文
     * name:数据库的名字 
     * factory 目的创建cursor对象   
     * version 数据库的版本   从1开始
     */
    public MyOpenHelper(Context context) {
        super(context, "itheima.db", null,1);        
    }
    /**
     * 当数据库第一次创建的时候调用
     * 那么这个方法特别适合做表结构的初始化  创建表就是写sql语句
     */
    public void onCreate(SQLiteDatabase db) {
        //id 一般以_id 
        db.execSQL("create table info(_id integer primary key autoincrement,name varchar(20),phone varchar(20))");
    }
    /**
     * 当数据库版本升级的时候调用 
     * 这个方法适合做   表结构的更新
     */
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("alter table info add phone varchar(20)");
    }

}

安卓利用SQL语句进行增删改查

package com.itheima.sqlite;

import android.os.Bundle;
import android.app.Activity;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.view.Menu;
import android.view.View;

public class MainActivity extends Activity {
private MyOpenHelper myOpenHelper;
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    myOpenHelper = new MyOpenHelper(getApplicationContext());
    //打开或者创建数据库  如果是第一次就是创建   
    //SQLiteDatabase sqLiteDatabase = myOpenHelper.getWritableDatabase();
    //打开或者创建数据库  如果是第一次就是创建     如果磁盘满了 返回只读的
    //SQLiteDatabase readableDatabase = myOpenHelper.getReadableDatabase();
        
}

//点击按钮增加一条记录
public void click1(View v){
    //[1]获取数据库对象
    SQLiteDatabase db = myOpenHelper.getWritableDatabase();
    //[2]执行增加一条的sql语句 
    db.execSQL("insert into info(name,phone) values(?,?)", new Object[]{"小鸣","19189897878"});
    //[3]数据库用完需要关闭
    db.close();
    
}


//删除
public void click2(View v){
    SQLiteDatabase db = myOpenHelper.getWritableDatabase();
    db.execSQL("delete from info where name=?", new Object[]{"小鸣"});
    db.close();
    
}

//更新 
public void click3(View v){
    SQLiteDatabase db = myOpenHelper.getWritableDatabase();

    db.execSQL("update info set phone=? where name=? ", new Object[]{"1910000000","小鸣"});
    
    db.close();
}

//查找
public void click4(View v){
    SQLiteDatabase db = myOpenHelper.getReadableDatabase();
    Cursor cursor = db.rawQuery("select * from info", null);
    if (cursor!= null&&cursor.getCount()>0) {
        while(cursor.moveToNext()){
            //columnIndex代表列的索引 
            String name = cursor.getString(1);
            String phone = cursor.getString(2);
            System.out.println("name:"+name+";phone:"+phone);    
        }
    }
    
    
}

}

附:布局文件
<Button

    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:onClick="click1"
    android:text="add" />

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:onClick="click2"
    android:text="delete" />

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:onClick="click3"
    android:text="update" />

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:onClick="click4"
    android:text="find" />


在xml布局文件中添加

android:singleLine="true"
android:ellipsize="marquee"
android:focusable="true"

这些属性
即:

    <TextView
    android:id="@+id/textview1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:singleLine="true"
    android:ellipsize="marquee"
    android:focusable="true"
    android:focusableInTouchMode="true"
    android:text="@string/hello_world" />

如果是多个TextView,则需要把定义一个类继承TextView,并且把TextView改成包名+自己定义的类名
代码示例如下:

  <com.sunxiaoning.marqueetextviewdemo.MarqueeText
    android:id="@+id/textview1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:singleLine="true"
    android:ellipsize="marquee"
    android:focusable="true"
    android:focusableInTouchMode="true"
    android:text="@string/hello_world" />
 <com.sunxiaoning.marqueetextviewdemo.MarqueeText
    android:layout_below="@+id/textview1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginTop="10dp"
    android:singleLine="true"
    android:ellipsize="marquee"
    android:focusable="true"
    android:focusableInTouchMode="true"
    android:text="@string/hello_world" />

同时自定义一个类,继承TextView重写TextView的所有方法和isFocused()方法,使isFocused()的返回值为true

package com.sunxiaoning.marqueetextviewdemo;

import android.content.Context;
import android.util.AttributeSet;
import android.widget.TextView;

public class MarqueeText extends TextView{

    public MarqueeTexct(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        
    }

    public MarqueeTexct(Context context, AttributeSet attrs) {
        super(context, attrs);
        
    }

    public MarqueeTexct(Context context) {
        super(context);
        
    }

    public boolean isFocused() {
        return true;
    }

}

final关键字用于修饰类、变量和方法,它有“这是无法改变的”或者“最终”的含义,因此被final修饰的为不能被继承,被final修饰的方法不能被子类重写,final修饰的变量(局部变量和成员变量)是常量,只能赋值一次。

1.final关键字修饰的类

java中的类被final关键字修饰后,该类将不能被继承,也不能够派生子类。为了避免被继承,被子类复写功能。

2.final关键字修饰方法

当一个类的方法被final关键字修饰后,这个类的子类将不能重写改方法。

3.final关键字修饰变量

java中被final修饰的变量(既可以修饰成员变量,有可以修饰局部变量)为常量,它只能被赋值一次,也就是说final修饰的变量一旦被赋值,其值不能改变。

注意:当在描述事物时,一些数据的出现值是固定的,那么这时为了增强阅读性,都给这些值起个名字。方便于阅读。而这个值不需要改变,所以加上final修饰。作为常量:常量的书写规范所有字母都大写,如果由多个单词组成。单词间通过_连接。
注:内部类定义在类中的局部位置上是,只能访问该局部被final修饰的局部变量。

TextView控件的常见属性

android:id 控件的id
android:layout_width 控件的宽度
android:layout_height 控件的高度
android:singleLine 单行显示
android:text 文本内容
android:textSize 文本大小
android:textColor 文本颜色
android:background 控件背景


EditText控件的常见属性

android:id 控件的id
android:layout_width 控件的宽度
android:layout_height 控件的高度
android:text 文本内容
android:textSize 文本大小
android:textColor 文本颜色
android:background 控件背景
android:hint 输入提示文本
android:inputType 输入文本类型


ImageView(显示图片的一个控件)常见属性

android:src ImageView的内容图像
android:background ImageView的背景图片

安卓按钮的四大点击事件整理
首先写一下xml文件

<Button
    android:id="@+id/button1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_below="@+id/editText1"
    android:text="拨号" />

<Button
    android:id="@+id/button2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_below="@+id/button1"
    android:layout_marginTop="14dp"
    android:text="button1" />

<Button
    android:id="@+id/button3"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignBaseline="@+id/button2"
    android:layout_alignBottom="@+id/button2"
    android:layout_marginLeft="26dp"
    android:layout_toRightOf="@+id/button2"
    android:text="button2" />

<Button
    android:id="@+id/button4"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignBaseline="@+id/button3"
    android:layout_alignBottom="@+id/button3"
    android:layout_marginLeft="18dp"
    android:layout_toRightOf="@+id/button3"
    android:text="button3" />

<Button
    android:onClick="click"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignRight="@+id/button3"
    android:layout_below="@+id/button3"
    android:layout_marginTop="62dp"
    android:text="test" />

点击事件
【1】定义一内部类去实现按钮的点击事件

public class MainActivity extends ActionBarActivity {

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //加载一个布局
        setContentView(R.layout.activity_main);
        //找到按钮
        Button btn_call = (Button) findViewById(R.id.button1);
        //给button按钮设置一个点击事件
        btn_call.setOnClickListener(new MyClickListener());
    }
    //定义一个类去实现   按钮需要的接口类型
    private class MyClickListener implements OnClickListener{
        
        //当按钮被点击的时候调用
        @Override
        public void onClick(View v) {
            System.out.println("我被点击了");
            }
        }
    }    
}

【2】通过匿名内部类去实现

public class MainActivity extends ActionBarActivity {
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //加载一个布局
        setContentView(R.layout.activity_main);
        //找到按钮
        Button btn_call = (Button) findViewById(R.id.button1);
        //给button按钮设置一个点击事件
        btn_call.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                System.out.println("按钮被点击了");
            }
        });
    }    
}

【3】让当前类实现OnClickListener接口类型(用于布局里面有很多按钮需要被点击的时候)

public class MainActivity extends ActionBarActivity implements OnClickListener {    
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 加载一个布局
        setContentView(R.layout.activity_main);
        
        // 找到按钮
        Button btn_call = (Button) findViewById(R.id.button1);
        Button btn_call1 = (Button) findViewById(R.id.button2);
        Button btn_call2 = (Button) findViewById(R.id.button3);
        Button btn_call3 = (Button) findViewById(R.id.button4);
        // 给button按钮设置一个点击事件
        // 按钮的第三种点击事件
        btn_call.setOnClickListener(this);
        btn_call1.setOnClickListener(this);
        btn_call2.setOnClickListener(this);
        btn_call3.setOnClickListener(this);
    }

    // 当点击按钮的时候执行
    public void onClick(View v) {
        // 具体判断点击的哪个按钮
        switch (v.getId()) {
        case R.id.button1:
            System.out.println("1按钮被点击了");
            break;
        case R.id.button2:
            System.out.println("2按钮被点击了");
            break;
        case R.id.button3:
            System.out.println("3按钮被点击了");
            break;
        case R.id.button4:
            System.out.println("4按钮被点击了");
            break;

        default:
            break;
        }
    }
}

【4】在按钮的布局上加上一个onClick属性 在Activity里面定义一个方法 方法名和属性名相同(适合自己做一些demo)

public class MainActivity extends ActionBarActivity  {

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 加载一个布局
        setContentView(R.layout.activity_main);
    }
    //声明一个方法  方法名和你要点击的这个按钮  在布局中的onClick属于一样
    public void click(View v) {
        System.out.println("按钮被点击了");
    }

    }

}







配置环境

想要在电脑的任意位置使用adb命令就需要配置环境变量
右击“此电脑”->选择“属性”->选择“高级系统设计”->选择“高级”->选择“环境变量”->找到"path"
QQ截图20170924091227.png
选中"path"之后->点击“编辑”->选择“新建”
QQ截图20170924091323.png
填入adb的路径即可
QQ截图20170924091355.png
最后确认退出即可

常见命令

1. adb kill-server  关闭adb服务进程。
2. adb start-server  开启服务
3.adb install [-r] [-s]  <应用名>  
    这个命令将指定的apk文件安装到设备上.
   -r 强制安装(在某些情况下可以已有些应用程序在运行或不可写,可加上此参数强制安装)
   -s 将apk文件安装在SD-Card
4.adb uninstall [-k] <应用的包名>    卸载应用
   -k 参数,为卸载软件但是保留配置和缓存文件.
5.adb shell  进入手机终端
6.adb push <本地路径> <远程路径>    用push命令可以把本机电脑上的文件或者文件夹复制到设备(手机)
7.adb pull <远程路径> <本地路径>    用pull命令可以把设备(手机)上的文件或者文件夹复制到本机电脑