zoukankan      html  css  js  c++  java
  • Android学习笔记

     安装Androidstudio注意事项:

         Androidstudio常用快捷键:https://www.cnblogs.com/kangyi/p/4246117.html

         Androidstudio常用插件:https://www.open-open.com/lib/view/open1480329318348.html

         Androidstudio常用设置:https://blog.csdn.net/weixin_39251617/article/details/79869586

         Androidstudio真机调试时出现mainSDK(API 28)>devicesdk(API 25): https://blog.csdn.net/languobeibei/article/details/78293497

        Androidstudio SDK开发帮助文档:http://www.pansoso.com/d/225046/

      开发前的配置

    配置build.gradle(Module:app):
    
    
    版本间关系: minSdkVersion <= targetSdkVersion <= compileSdkVersion <= buildToolsVersion
    理想版本关系: minSdkVersion <= targetSdkVersion == compileSdkVersion == buildToolsVersion:
    
    
    apply plugin: 'com.android.application'
    
    android {
        compileSdkVersion 26
        buildToolsVersion "28.0.3"
        defaultConfig {
            applicationId "com.helloworld.lq.helloworld"
            minSdkVersion 22
            targetSdkVersion 26
            versionCode 1
            versionName "1.0"
            testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        }
        buildTypes {
            release {
                minifyEnabled false
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            }
        }
    }
    
    dependencies {
        implementation fileTree(dir: 'libs', include: ['*.jar'])
        implementation 'com.android.support:appcompat-v7:26.+'
        implementation 'com.android.support.constraint:constraint-layout:1.1.3'
        testImplementation 'junit:junit:4.12'
        androidTestImplementation 'com.android.support.test:runner:1.0.2'
        androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
    }
    添加gradle:file:///C:/Users/Administrator/.gradle/wrapper/dists/gradle-4.6-all/bcst21l2brirad8k2ben1letg/gradle-4.6-all.zip

    (一)目录文件:

    Helloappuildgenerated ot_namespaced_r_class_sourcesdebugprocessDebugResources comexamplehelloR.java文件不可修改,res文件下 的资源会在R.java中自动生成id(使用src文件中的资源直接引用R.xxx)几个内部类

    Helloappsrcmain esdrawable:放置图片(不同的分辨率)

    Helloappsrcmain eslayout文件:为activity配置布局

    Helloappsrcmain esvalues文件:放置键值对(为国际化语言考虑)

    HelloappsrcmainAndroidManifest.xml文件是配置整个应用程序

    <android:icon配置应用程序的图标。。。
    <android:label配置应用程序的标签。。。
    配置activity:
    <activity android:name=".Hello1Activity"></activity>
            <activity android:name=".MainActivity">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>

    //首先启动某个activity添加的代码:

    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
    
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>

    (二)Activity

    1,作用:可见的,用户和应用程序之间的交互接口,放置不同的控件(控件的容器)

    2,activity要点:

        ①activity是一个类,需要继承Activity

        ②需要复复写onCreate()方法

        ③AndroidManifest.xml文件中会出现activity配置

       ④

    3,多个activity的关系

       

    Component name:指定一个请求跳转到另一个activity的名字

    Action:指定跳转的activity的行为(如Intent.ACTION_SENDTO是一个发短信的行为)

    Date:传递的数据(uri类型)

    Extras:放置一些键值对

    //点击MainActivity的按钮,跳转到Hello1Activity

    package com.example.hello; import android.content.Intent; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; import android.widget.Toast;
    public class MainActivity extends AppCompatActivity { private Button bt_a; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); bt_a=(Button) findViewById(R.id.bt_a); bt_a.setOnClickListener(new Bt_aListener()); } class Bt_aListener implements View.OnClickListener//设置按钮的监听器,实现跳转功能 { @Override public void onClick(View v) { Intent intent=new Intent(); intent.setClass(MainActivity.this, Hello1Activity.class); MainActivity.this.startActivity(intent);//传参 } }
    package com.example.hello;

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

    public class Hello1Activity extends AppCompatActivity {
    private TextView tv_b=null;
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_hello1);
    /* Intent intent=getIntent();
    String data=intent.getStringExtra("data1");*/
    tv_b=(TextView) findViewById(R.id.tv_b);
    //tv_b.setText(data);
    tv_b.setText(R.string.HelloActivity);
    }
    }



    4,用intent在activity之间传递数据(两个Activity可能不是在一个应用程序中)

        (1),从MainActivity向HelloActivity传递参数123

      

    package com.example.hello;
    
    import android.content.Intent;
    import android.os.Bundle;
    import android.support.v7.app.AppCompatActivity;
    import android.view.View;
    import android.widget.Button;
    public class MainActivity extends AppCompatActivity
    {
        private Button bt_a;
        @Override
        protected void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            bt_a=(Button) findViewById(R.id.bt_a);
            bt_a.setOnClickListener(new Bt_aListener());
        }
      class Bt_aListener implements View.OnClickListener
      {
            @Override
          public void onClick(View v)
          {
              Intent intent=new Intent();
              intent.putExtra("data1", "123");
              intent.setClass(MainActivity.this, Hello1Activity.class);
              MainActivity.this.startActivity(intent);
          }
      }
    }


    package com.example.hello;

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

    public class Hello1Activity extends AppCompatActivity {
    private TextView tv_b=null;
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_hello1);
    Intent intent=getIntent();
    String data=intent.getStringExtra("data1");
    tv_b=(TextView) findViewById(R.id.tv_b);
    tv_b.setText(data);
    //tv_b.setText(R.string.HelloActivity);
    }
    }
     

        (2)用MainActivity实现发短信功能:

    package com.example.hello;
    
    import android.content.Intent;
    import android.net.Uri;
    import android.os.Bundle;
    import android.support.v7.app.AppCompatActivity;
    import android.view.View;
    import android.widget.Button;
    public class MainActivity extends AppCompatActivity
    {
        private Button bt_a;
        @Override
        protected void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            bt_a=(Button) findViewById(R.id.bt_a);
            bt_a.setOnClickListener(new Bt_aListener());
        }
      class Bt_aListener implements View.OnClickListener
      {
            @Override
          public void onClick(View v)               //必须重写这个方法
          {
            /*  Intent intent=new Intent();
              intent.putExtra("data1", "123");
              intent.setClass(MainActivity.this, Hello1Activity.class);
              MainActivity.this.startActivity(intent);*/
              Uri uri=Uri.parse("smsto://0800000123");
              Intent intent=new Intent(Intent.ACTION_SENDTO,uri );
              intent.putExtra("data2", "欢迎使用!");
              startActivity(intent);
          }
      }
    }

      5,activity中常见的控件;
        (1),TextView:文本信息

         (2),ExitText:可编辑的文本框

         (3),Button:按钮

         (4),meno:菜单

         初始化一个菜单(当用户点击菜单按钮调用此方法)

          

     @Override
        public boolean onCreateOptionsMenu(Menu menu)
        {
            menu.add(0, 1,1 , R.string.menu_a);   //add(当前组的id,菜单小块item的id,当前菜单中小块排序的id,小块显示的值)
            menu.add(0, 1,2 , R.string.menu_b);
            return super.onCreateOptionsMenu(menu);
        }

       当用户点击菜单中的某个item时:

    @Override
        public boolean onOptionsItemSelected(MenuItem item)
        {
            int id=item.getItemId();
            if(id==1)
            {
                finish();
            }
            return super.onOptionsItemSelected(item);
        }

        (5)练习做一个实现两个数相乘的APP

          ①.java代码:

    //MainActivity.java
    
    package com.example.hello;
    
    import android.content.Intent;
    import android.os.Bundle;
    import android.support.v7.app.AppCompatActivity;
    import android.view.Menu;
    import android.view.MenuItem;
    import android.view.View;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.TextView;
    public class MainActivity extends AppCompatActivity
    {
        private TextView tv;
        private EditText et_a;
        private EditText et_b;
        private Button bt;
        @Override
        protected void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            tv=(TextView)findViewById(R.id.tv);
            et_a=(EditText)findViewById(R.id.et_a);
            et_b=(EditText)findViewById(R.id.et_b);
            bt=(Button)findViewById(R.id.bt);
            //bt.setText("计算");
            //tv.setText("乘以(X)");
            tv.setText(R.string.tv);
            bt.setText(R.string.bt);
            bt.setOnClickListener(new BtListener());
        }
        @Override
        public boolean onCreateOptionsMenu(Menu menu)
        {
            menu.add(0, 1,1 , R.string.menu_a);   //add(当前组的id,菜单的id,当前菜单中小块排序的id,小块显示的值)
            menu.add(0, 1,2 , R.string.menu_b);
            return super.onCreateOptionsMenu(menu);
        }
        @Override
        public boolean onOptionsItemSelected(MenuItem item)
        {
            int id=item.getItemId();
            if(id==1)
            {
                finish();
            }
            return super.onOptionsItemSelected(item);
        }
         class BtListener implements View.OnClickListener
        {
            @Override
            public void onClick(View v)
            {
                Intent intent=new Intent();
                String et_astr=et_a.getText().toString();
                String et_bstr=et_b.getText().toString();
                intent.putExtra("et_a", et_astr);
                intent.putExtra("et_b", et_bstr);
                intent.setClass(MainActivity.this,Hello1Activity.class );
                MainActivity.this.startActivity(intent);
            }
        }
    }
    
    
    //HelloActivity.java
    
    package com.example.hello;
    
    import android.content.Intent;
    import android.os.Bundle;
    import android.support.v7.app.AppCompatActivity;
    import android.widget.TextView;
    
    public class Hello1Activity extends AppCompatActivity
    {
       private TextView tv_b;
        @Override
        protected void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_hello1);
            tv_b=(TextView)findViewById(R.id.tv_b);
            Intent intent=getIntent();
            String et_astr=intent.getStringExtra("et_a");
            String et_bstr=intent.getStringExtra("et_b");
            int et_ain=Integer.getInteger(et_astr);
            int et_bin=Integer.getInteger(et_bstr);
            int result=et_ain*et_bin;
            tv_b.setText(result+ " " );     //setText(必须是字符串类型)
        }
    }
    
    
    //

         ②.xml代码:

    //activity_main.xml
    
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:padding="10dp"
        tools:context=".MainActivity">
        <EditText
            android:id="@+id/et_a"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />
        <TextView
            android:id="@+id/tv"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
    
             />
        <EditText
            android:id="@+id/et_b"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />
    
        <Button
            android:id="@+id/bt"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:textColor="#00f"
    
        />
    
    </LinearLayout>
    
    //activity_hello1.xml
    
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".Hello1Activity">
    <TextView
        android:id="@+id/tv_b"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        />
    </LinearLayout>
    
    //string.xml
    
    <resources>
        <string name="app_name">Hello</string>
        <string name="HelloActivity">HelloActivity!</string>
        <string name="tv">乘以(X)</string>
        <string name="bt">计算</string>
        <string name="menu_a">后退</string>
        <string name="menu_b">关于</string>
    </resources>

         ③activity配置文件

    //AndroidMainifest.xml
    
    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.hello">
    
        <application
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:roundIcon="@mipmap/ic_launcher_round"
            android:supportsRtl="true"
            android:theme="@style/AppTheme">
            <activity android:name=".Hello1Activity">
    
            </activity>
            <activity android:name=".MainActivity">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
        </application>
    
    </manifest>

       ④出现的问题:不知道怎么回事,在真机上调试activity之间的跳转出现闪退现象。

      6,Activity的生命周期函数(当手机内存不足时调用onPause(),onStop(),onDestroy()方法的Activity会被kill掉):

        (1)首先是创建activity,也就是onCreate()方法,关于这个方法,官方文档描述为:第一种创建该activity时调用,主要完成静态数据的初始化等,还提供一个含有该activity自                己“冻结”的状态的Bundle对象;该方法常常后面会伴随onStart()方法。 

        (2)onStart()方法:当该activity对用户可见的时候调用

        (3)onResume()方法:当activity可以获取焦点时调用(也就是该activity是栈顶activity的时候);

        (4)onStop()方法:该方法适合onStart()方法对应的方法,即当该activity不可见的时候调用

         (5)onPause()方法:当activity不可以获取焦点时调用(也就是该activity不是栈顶activity的时候);

        (6)onDestroy()方法:当该activity销毁的时候调用(通常会在这里放一些解绑服务,取消广播注册的操作);

    还有一个用得较少:

    (7)onRestart()方法:当你的activity执行了onStop()之后,又想实现onStart()的效果,这个时候就会执行该方法
     图示:

        启动第一个Activity:

            

        从第一个Activity启动第二个Activity:(当第二个Activity完全遮掩第一个Activity时)若第二个Activity以小窗口形式将第一个Activity遮掩一部分,则不调用FirstActivity的onStop()方     法。

         

       从第二个Activity返回到第一个Activity:

        。SecondActivity

             -onPause()

        .FirstActivity

            -onRestart()

        .FirstActivity    

           -onStart()

        .FirstActivity

           -onResume()

       .SecondActivity

          -onStop()

       .SecondActivity

          -onDestroy():通常在调用finish()方法或当前内存不足时调用

      Task(任务)以栈的形式运行过程:

          打开第一个Activity,第一个Activity被压入其中,启动第二个Activity,第二个Activity被压入其中,手机显示最上面的Activity...

           

        当点击返回上面的Activity依次被取除。

         注意:当将第二个Activity中的按钮监听器中的startActivity(Intent)替换为finish(),则只会影响返回时的效果,在第三个Activity显示时点击返回,会直接返回到第一个Activity。

       SQLite数据库(可嵌入,程序驱动)访问

      

          

      SharedPreferenced的使用方法:SharedPreferences 是一个轻量级的存储类,主要是保存一些小的数据,一些状态信息

         第一步:初始化
             * 获取SharedPreferenced对象

            * 第一个参数是生成xml的文件名,第二个参数是存储的格式,SharedPreferences preferences = getSharedPreferences("OpenCount", Context.MODE_PRIVATE);

       第二步:获取edit对象

         //获取到edit对象,SharedPreferences.Editor edit = preferences.edit();

       第三步:通过edit对象写入数据,第一个参数是属性名,第二个参数是所要传的值 

                 通过editor对象写入数据,edit.putInt("count",1);

      第四步:将数据保存到xml文件里,提交数据存入到xml文件中,edit.commit();

    第五步:通过get方法读取所存的信息

    int count = preferences.getInt("count", 0);
    SharedPreferences这个方法可以将数据存入到本地文件,用来存储登录次数,和登录信息等各种信息

      SetFilters对输入框格式,字符数的控制:

       (1) et_vcode.setFilters(new InputFilter[ ]);参数是一个InputFilter类型的数组

         (2)如果直接添加限制字数的规则,直接newLengthFilter就可以了,例如限制输入最大不超过16位:et_vcode.setFilters(new InputFilter[ ]{new InputFilter.LengthFilter(16)});

          (3)如果此时你还有另一个规则,例如只能输入a-z的小写字母,直接在InputFilter数组中添加  : et_vcode.setFilters(newInputFilter[{ codeInputFilter  ,  newInputFilter .  LengthFilter(16)});

        (4) codeInputFilter继承InputFilter,规则自己定义,重写里面的public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {}

      filter参数介绍:

      source   :变化的字符串

      start    :变化字符的首字符下标

      end      :变化字符的尾字符下

      dest     :带光标的字符串

      dstart   :光标的起始位置 

      dend     :光标的结束位置

      filter方法返回的是一个CharSequence,用来控制可编辑控件添加字符时的约束条件。

    主要分为三种情况:返回null,表示可正常添加source字符串;返回"",表示不变动原字符;返回以上之外的字符串,表示将返回的该字符串追加到远字符串中。

    例如:

    edit_register.setFilters(new InputFilter[]                  //设置输入格式
                    {
                    new InputFilter()
                    {
                        @Override
                        public CharSequence filter(CharSequence source, int start, int end,Spanned dest, int dstart, int dend)
                        {
                            for (int i = start; i < end; i++)
                            {
                                if (!Character.isLetterOrDigit(source.charAt(i)) &&
                                        !Character.toString(source.charAt(i)).equals("_"))
                                {
                                    Toast.makeText(Register_Activity.this, "只能使用'_'、字母、数字、汉字注册!", Toast.LENGTH_SHORT).show();
                                    return "";
                                }
                            }
                            return null;
                        }
                    }
            })
    方法:onEditorAction(TextView textView,int actionId,KeyEvent keyEvent)的用法:
    * 第一个参数:TextView textView 表示当前触发事件的EditText的对象,类似于textView=findViewById(R.id.edit_account)
    * 第二个参数:int actionId 表示 按下“完成按钮”,这里和xml文件中EditText属性imeOptions对应
          actionId的取值:
    imeOptions=”actionUnspecified” –> EditorInfo.IME_ACTION_UNSPECIFIED
    imeOptions=”actionNone” –> EditorInfo.IME_ACTION_NONE
    imeOptions=”actionGo” –> EditorInfo.IME_ACTION_GO
    imeOptions=”actionSearch” –> EditorInfo.IME_ACTION_SEARCH
    imeOptions=”actionSend” –> EditorInfo.IME_ACTION_SEND
    imeOptions=”actionNext” –> EditorInfo.IME_ACTION_NEXT
    imeOptions=”actionDone” –> EditorInfo.IME_ACTION_DONE (如果编辑信息输入完成 )

    * 但要注意actionId是指软盘上的,而键盘上的actionId与软盘上的不一样;即在软盘上“完成按钮”的actionId为0,
    * 而键盘上的“完成按钮(回车键)”的actionId为6
    * 第三个参数:KeyEvent keyEvent 表示 按下“完成按钮”,这里和xml文件中EditText属性imeOptions对应,但keyEvent里面的内容更丰富,内容如下:
    * keyEvent.toString()=KeyEvent { action=ACTION_DOWN, keyCode=KEYCODE_ENTER,
    * scanCode=28, metaState=0, flags=0x8, repeatCount=0, eventTime=5664212, downTime=5664212, deviceId=1, source=0x301 }
    * 返回值:返回true,保留软键盘;false,隐藏软键盘
    InputMethodManager imm =(InputMethodManager) getSystemService(Login_Activity.this.INPUT_METHOD_SERVICE);   //调用系统服务(包括显示键盘,隐藏键盘)
     imm.hideSoftInputFromWindow(edit_password.getWindowToken(), 0);     //隐藏键盘
    
    
     对输入的密码显示,隐藏操作:
    boolean flag=false;
    if
    (flag == true) {//不可见 edit_password.setTransformationMethod(HideReturnsTransformationMethod.getInstance()); //显示密码 flag = false; openpwd.setBackgroundResource(R.drawable.invisible); }
    else
    { edit_password.setTransformationMethod(PasswordTransformationMethod.getInstance()); //隐藏密码 flag = true; openpwd.setBackgroundResource(R.drawable.visible); }

       TextUtils.isEmpty(CharSequence str)这个方法是系统为我们提供的一个非常方便的判断一个CharSequence类型的
    参数是否为空的方法,这个方法的返回值是一个boolean,当括号内参数为(null)或者("")时,返回true。

       TextUtils.equals(CharSequence str1, CharSequence str2)这个是比较括号内两个CharSequence类型的参数是否相等

    
    
  • 相关阅读:
    牛津
    负逻辑
    NB的为运算
    顿悟--人生也许该如此
    河南近亿国民致教育部的公开信:国民待遇!
    三年
    简体字、白话文的应用是流传百年的错误思潮
    鸿蒙系统的源码,请需要的同志查看
    解决好123劫持主页的方法
    vue echarts 给双饼图添加点击事件
  • 原文地址:https://www.cnblogs.com/lq13035130506/p/10728988.html
Copyright © 2011-2022 走看看