Android基础整理



  • 项目管理与文件关联

    .java文件中应用 .xml文件

    setContentView(R.layout.activity_main); //引用activity_main.xml文件
    

    Activity组件必须在 AndroidManifest.xml注册

    <activity android:name=".MainActivity"/>
    

    activity跳转

    startActivity(new Intent(this,MainActivity2.class));
    

    Context与Activity的关系

    Context是一个抽象类,可以理解为对开发场景的抽象,Activity继承Context。

    Activity通过Context接口去访问Android系统的服务和资源:

    1. 获取应用相关信息
    2. 获取系统/应用资源(Manager、color、drawable等)
    3. 四大组件之间的交互
    4. 文件相关
    5. 数据库相关

    Context最终类型:Activity、Service、Application

    1. 与UI相关的场景都使用Activity类型Context(最常用)
    2. 较长生命周期使用Application类型Context
    Activity.getApplication();
    //语义性较强,用来获取Application实例,作用域:Activity、Service,但不能在BroadcastReceiver里使用
    Activity.getApplicationContext();  
    //作用域更广,优先考虑这个全局的进程Context
    /*对这两个方法的区别主要在于作用域的区别*/
    
    getBaseContext();  
    //返回构造函数指定的Context/setBaseContext()里传入的Context
    View.getContext();  
    //返回当前View对象的Context对象,通常是当前正在展示的Activity对象
    Activity.this;  //返回当前Activity的Context
    

    Context引起内存泄漏

    错误使用Context就可能引起内存泄漏问题

    不要让生命周期长于Activity的对象持有到Activity的引用。

    假如Activity A去getInstance获得instance对象,传入this,常驻内存的保存了传入的Activity A对象,并一直持有,即使Activity被销毁掉,但因为它的引用还存在,就不可能消失,这样就导致了内存泄漏。

    LayoutInflater加载布局

    1. 获取LayoutInflater实例
    2. 调用该实例的inflate()方法来加载一个布局
    3. 调用主布局的addView()方法将它添加到LinearLayout中
    inflate(int resource, ViewGroup root, boolean attachToRoot)
    

    第三个参数设置为false表示将布局文件最外层的所有layout属性进行设置

    如果root不为NULL第三参数设置为true会给加载的布局文件指定一个父布局

    控件

    1.textview

    <LinearLayout>
    	<TextView
                  属性设置
                  android:id="@+id/id名"
                  android:text=""
                  android:textColor="#FF000000"
                  android:gravity=""
    </LinearLayout>
    

    基础属性:

    属性名 属性含义 属性值
    layout_width 组件宽度 match_parent wrap_content,值+单位dp
    layout_height 组件高度 同上
    id 设置id @+id/idName
    text 文本内容 @string/name(在strings.xml里设置)
    textColor 字体颜色 @color/name(在colors.xml里设置)
    textStyle 字体风格 normal(0),bold(1),italic(2)
    textSize 字体大小 单位用‘sp’(为满足适配条件)
    background 背景色 颜色或图片
    gravity 内容的对齐方向 top,bottom,certer,center_vertical....

    通过设置的id获取控件:

    v = findViewById()	//in .java
    

    跑马灯效果TextView

    <TextView
              android:id="@+id/marqe"
              android:layout_width="match_parent"
              android:layout_height="200dp"
              android:text="@string/marqe"
              android:gravity="center_vertical"
              android:singleLine="true"<!--内容单行显示-->
              android:ellipsize="marquee"
              android:marqueeRepeatLimit:"marquee_forever"			<!--字母动画重复次数-->
              android:focusable="true"
              android:focusableInTouchMode="true"
              <!--android:clickable="true"-->
    		  <requestFocus/>
    </TextView>
    

    2.Button

    <Button
            android:text=""
            android:layout_width=""
            android:layout_height=""
            android:background="@drawable/filename"
    		<!--进行不同状态下按钮图案设置-->
        	android:backgroundTint="@color/"
    </Button>
            
    

    采用Drawable资源

    new 一个drawable文件root element: <selector>通过<item_android:drawable="" android:state_pressed="">

    button事件处理

    1. 点击事件
    2. 长按事件
    3. 触摸事件
    Botton btn =findViewById(R.id.btn);
    //点击事件
    btn.setOnClickListener(new View.OnClickListener(){
        @Override
        public void onClick(View v){
            //Log调试
        }
    });
    //长按事件
    btn.setOnLongClickListener(new View.OnLongClickListener(){
        @Override
        public void onLongClick(View v){
            //Log调试
            return false;
        }
    });
    //触摸事件
    btn.setOnTouchListener(new View.OnTouchListener(){
        @Override
        public void onTouch(View v, MotionEvent event){
            //Log调试
            return false;
        }
    });
    

    3.EditText

    <EditText
              android:layout_width=""
              android:layout_height=""
        	  android:hint="请输入..."
        	  android:textColorHint=
        	  android:inputType="" <!--会弹出相应的输入键,和密码格式等-->
        	  android:drawableLeft=""
    
    </EditText>
    

    4.ImageView

    <ImageView
               android:src="@drawable/name"
               android:scaleType="fitXY"   /*fitCenter,fitEnd,fitStart,center,centerInside,matrix..*/
               android:maxWidth=""
               android:maxHeight=""最大宽高设置
               android:adjustViewBounds="true"配合最大宽高自动调整
    
               >
    </ImageView>
    

    5.ProgressBar

    <ProgressBar
              	 android:layout_width=""
             	 android:layout_height=""             
                 >
    </ProgressBar>
    
    ProgressBar pb=findViewById(R.id.pb);
    pb.getVisibility(View.VISIBLE);//进度设置显示
    pb.getVisibility(View.GONE);//进度设置不显示
    

    6.Notification

    • 创建一个NotificationManager

    布局

    <LinearLayout
                  android:orientation="vertical" 纵向排列
                  android:gravity="center"
    			  android:divider="@drawable/divider" 加divider图片           
                  >
    </LinearLayout>
    
    <RelativeLayout 相对于父容器定位
                    android:layout_centerInParent="true" 中间位置
                    android:layout_alignParentLeft="true" 左对齐
                    >
    
    </RelativeLayout>
    <RelativeLayout 根据兄弟组件定位
                    android:layout_toLeftOf="@id/name"
                    >
    </RelativeLayout> 
                    
    
    margin
    设置组件与父容器的间距
    padding
    设置组件内部的边距
    
    <FrameLayout
                 android:foreground=""
                 >
    </FrameLayout>
    
    <TableLayout
                 android:collapseColumns="需要被隐藏的列的序号(0~)"
                 android:stretchColumns="需要被拉伸的列的序号(0~)"条件是有剩余空间
                 android:shrinkColumns="需要收缩的列的序号(0~)"条件是有超出空间
                 >
        <TableRow>
            控件排列显示在同一行,超出部分不显示
            <Botton
                    子控件属性
                    android:layout_column="显示在第几列"
                    android:layout_span="横向跨几列"
                    >
            </Botton>
        </TableRow>
    </TableLayout>  常见的组合使用
    
    constraintlayout
    

    RecyclerView

    实现一个RecyclerView需要的

    1. item.xml
    2. RecyclerViewAdapter

    布局方式

    GridLayoutManager() 传入context和列数

    LinearLayoutManager

    StaggeredGridLayoutManager

    碎片Fragment

    1. 具备生命周期(子activity属性)
    2. 必须委托在activity中才能运行

    碎片生命周期

    • onAttach()碎片与活动创建关联
    • onCreate()
    • onCreateView()为碎片创建视图(加载布局)
    • onActivityCreated()与碎片相关联的活动创建完毕时调用
    • onStart()
    • onResume
    • onPause()
    • onStop()
    • onDestroyView()
    • onDestroy()
    • onDetach()

    碎片的切换

    1.创建碎片实例和待承接替换的碎片的容器(常用FrameLayout)
    2.通过getSupportFragmentManager()获取FragmentManager
    3.开启事务FragmentTransaction,调用beginTransaction()方法实现
    4.通过replace()传入容器id,待添加的碎片实例来添加或替换碎片
    5.提交事务commit()
    

    碎片中获取context对象

    调用**getActivity()**方法

    碎片与活动 碎片与碎片

    1. 获取Fragment实例

      Fragment fragment = (Fragment)getSupportFragmentManager().findFragmentById(R.id.fragment);

    Glide上载图片

    Glide.with(activity:this)//传入一个activity/context/fragment
        .load(string:"https:")//资源地址或id
        .apply(requestOptions)	//占位符的使用
        .into(name)//传入的容器对象
    
    //自带默认占位图
    RequestOptions requestOptions = new RequestOptions()
        .placeholder(R.drawable.hold)
        .error(R.drawable.error)
        .fallback(R.drawable.empty)
        .override(width:100,height:100)
    

    泛型:把类型当成参数

    接口

    接口和实现是分离的

    接口内拥有 的是常量和原型

    接口是一个统一的规范,提供的是共有属性和方法原型

    目前Android支持的最高jdk版本(jdk8)中,接口允许有默认方法



  • jdk8,也就是目前Android支持的最高jdk版本中,接口允许有默认方法,如:

    public interface MyInterface {
    
        default void hello() {
            // 默认方法
        }
    }
    


  • @almoon 好的👌已更正


 

Copyright © 2018 bbs.dian.org.cn All rights reserved.

Looks like your connection to Dian was lost, please wait while we try to reconnect.