Android 学习日记

Android布局管理

基础构件及布局

安卓的布局管理是靠xml与java相互合作完成的,本文下相关控件的属性都是使用xml语言编写

基础布局知识

  1. width:=match_parent/wrap_parent
  2. height:=match_parebt/wrap_parent
  3. weight 即某布局内各View对存在的剩余内容所占的权值

LinearLayout

  • LinearLayout相关学习知识点
  • gravity
  • Orientation
    • vertical
    • horizontal
  • margin
    • marginleft
    • marginright
    • margintop
    • marginbottom
  • padding
    • paddingleft
    • paddingright
    • paddingtop
    • paddingbottom

RelativeLayout

  • RelativeLayout相关学习
  • layout_toRightOf
  • layout_toLeftOf
  • layout_below
  • layout_alignBottom
  • layout_alignParentBottom
    需要注意的是,比如当想要在下图中View4右方加入View5时,要同时添加相对于4的右方与相对于2的下方,毕竟二维平面需要横纵坐标
    在这里插入图片描述
<View
        android:id="@+id/view_4"
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:background="#F709F7"
        android:layout_below="@id/view_1"
        android:layout_marginTop="40dp"
        />
															2020/2/23

TextView

我们首先新建一个TextViewActivity,在AndroidManifest.xml中声明(从project中创建Activity会自动声明),在Main中创建一个文本为TextView的按钮,按住ctrl点击R.id.activity_text_view进入其xml编辑文件,创建一个TextView组件,并将其id设为btn_textview,之后在MainActivity.java中完成该按钮对TextViewActivity的启动,具体方法如下:
1.新建btnTextView的实例,并找到在activity_main.xml中该控件的id
private Button btnTextView;
btnTextView = new findViewById(R.id.btn_textview);
2.设置该button的监听器,并在响应事件中设置Intent来启动TextViewActivity,这里Intent(arg0,arg1)中arg0类型为按钮所在的本活动,arg1指的是需要启动的活动的类

btn_textview.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this,ListViewActivity.class);
                startActivity(intent);
            }
        });
  • TextView相关学习
    • 文字内容,大小,颜色

    • text可以使用syc\values\strings里定义的常量

    • textsize

    • textcolor

    • 显示不下使用…

    • 比如一行长度限定,且只能使用一行显示,即maxlines=“1”,此时使用ellipse="end"省略显示不出的文字

    • 文字+icon

    • 将src\drawable中的资源加入文本框中

    • drawableLeft…

    • drawableTop…

    • drawablepadding…

    • 中划线,下划线

    • 这里中划线下划线都是在textView的activity中用java的paint来做的

      private TextView tv4,tv5,tv6;
      @Override
      protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_btn__view1);
      
          tv4=findViewById(R.id.tv_4);
          tv4.getPaint().setFlags(Paint.STRIKE_THRU_TEXT_FLAG);//中划线
          tv4.getPaint().setAntiAlias(true);
      
          tv5=findViewById(R.id.tv_5);
          tv5.getPaint().setFlags(Paint.UNDERLINE_TEXT_FLAG);//下划线
      
          tv6=findViewById(R.id.tv_6);
          tv6.setText(Html.fromHtml("<u>椎名林檎<u>"));//html u标签加下划线
          }
      
    • 走马灯

    • 这个特效是在xml中使用single,marquee和focus来做的,且输入字符需足够长(至少大于框件长度 )

    • singline=“true”

    • ellipse=“marquee”

    • marqueeRepeatLimit=“循环次数”(比如marquee_forever)

    • focusable=“true”,focusalbeInTouchMode=“true”

        													2020/2/24
      

Button

  • Button相关
    • 基本设置与textView相同(如文字大小,颜色),都可以对背景进行调整,如下:
    • 实心圆角矩形按钮
      <shape xmlns:android="http://schemas.android.com/apk/res/android"
          android:shape="rectangle">//形状设为矩形
          <solid
              android:color="#FF6600"/>//实心填充颜色
          <corners
              android:radius="5dp"/>//设置圆角半径
      </shape>
      
    • 边框圆角矩形按钮
      	<shape xmlns:android="http://schemas.android.com/apk/res/android"
          android:shape="rectangle">
          <stroke
              android:width="5dp"
              android:color="#FF6600"/>//设置边框粗细,矩形设为边框着色
          <corners
              android:radius="5dp"/>
      </shape>
      
    • 挤压效果矩形按钮
      <selector xmlns:android="http://schemas.android.com/apk/res/android">
          <item android:state_pressed="false">//按钮为未挤压态时,采用该布局
              <shape>
                  <solid android:color="#FF6600"/>
                  <corners android:radius="5dp"/>
              </shape>
          </item>
      
          <item android:state_pressed="true">//按钮为挤压态时,采用该布局
              <shape>
                  <solid android:color="#CC8F33"/>
                  <corners android:radius="5dp"/>
              </shape>
          </item>
      </selector>
      
        													2020/2/25
      

EditText

  • EditText
    可输入文本的view,可用作登录界面的用户,密码栏
    • textsize,textcolor均可调,background可调用drawable,可添加icon 注意:drawable内引入文件必须是英文名,且创建的新目录要带图片dpi清晰度,例 drawable-xxhdpi
    • hint 可在该框件内写入给定的文字,如用户名,密码等
    • addTextChangedListener 可添加对输入文本状态的监视器,有三种文本状态
      1. 写入前 beforeTextChanged

      2. 正在写入 onTextChanged 该状态监听一般为主要使用监听,可将输入的字符输出到log中

         public void onTextChanged(CharSequence s, int start, int before, int count) {
                        Log.d("edittext",s.toString());
                    }
        
      3. 写入中 afterTextChanged

         											2020/2/26
        

RadioButton

  • RadioButton
    • 多个RadioButton组合通常需要装在一个Radio Group的框架下,以完成单选的效果
    • RadioButton可去按钮,实现图示效果
      在这里插入图片描述
      步骤:
    1. 设置RadioGroup,orientation设为horizontal

    2. 设置两个权重相同的RadioButton,为其设置其中的文本颜色及大小

    3. 编写预设背景,drawable resource file设为selector类型,item中设置两个状态
      1)state_checked = true 即被选中状态,在该 < item > 中写入< shape >,< solid >

      <item android:state_checked="true">
              <shape>
                  <solid android:color="#FF6600"/>
                  <corners android:radius="5dp"/>
              </shape>
          </item>
      

      2)state_checked = false,在该< item >中写入 < shape > ,< stroke >

      <item android:state_checked="false">
              <shape>
                  <stroke android:width="5dp" android:color="#CC8F33"/>
                  <corners android:radius="5dp"/>
              </shape>
          </item>
      
    4. 将button设为@null,background采用drawable中设计的背景,将其中一个RadioButton的checked设为true,刚刚启动时该RadioButton即为选中状态

    • RadioGroup的监听器为setOnCheckedChangeListener,在响应事件中需声明组内的RadioButton,才能监听有关RadioButton并响应对应事件
      private RadioGroup mRg1;
          @Override
          protected void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.activity_radio_button);
              mRg1 = findViewById(R.id.rg_1);
              mRg1.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
                  @Override
                  public void onCheckedChanged(RadioGroup group, int checkedId) {
                      RadioButton radioButton = findViewById(checkedId);
                      Toast.makeText(RadioButtonActivity.this,radioButton.getText(),Toast.LENGTH_SHORT).show();
                      //这里将RadioGroup内被选中的RadioButton中的文本输出到屏幕上
                  }
              });
          }
      

CheckBox

  • CheckBox

  • 复选框 与RadioButton区别在, 每个复选框之间互不干扰,没有限定单选的功能,故没有相关的group

  • CheckBox可与TextView之间进行搭配

  • CheckBox中的按钮可以自定义,采用自己的icon来代替,可编辑框件内的文字

  • 可用自定义图标更换该控件中的框选按钮 新建一个使用selector的bg,设置框选状态下使用的drawable及未框选的drawable,然后在空间中将button设置为该bg

    <selector xmlns:android="http://schemas.android.com/apk/res/android">
        <item android:state_checked="false" android:drawable="@drawable/icon_unselected_64"/>
        <item android:state_checked="true" android:drawable="@drawable/icon_selected_64"/>
    </selector>
    

另,在设置Checkbox的启动button时,发现主页面控件超出屏幕。可使用ScrollView控件,滚动下滑。
ScrollView控件内只能放一个控件,因此在有多个控件需要下滑时,应在ScrollView中创建一个布局,将需要使用的其他控件放入该布局中即可。

															2020/2/27

ImageView

  • ImageView
    • 该控件可以显示框体中的图片,可设置图片的填充格式,与之前使用drawable填充类似。该控件也有background,但该控件是使用src提供该功能。可使用scalType改变填充格式。
      这里介绍以下三种:

      1. centerCrop 图片保持比例缩放,直至填满控件,会对超出控件的内容裁剪
      2. fitCenter 图片保持比例缩放,直至继续缩放会超出控件时停止,可能留出背景
      3. fitXY 将图片进行拉伸直至控件全部填满,控件与图片格式不匹配时图片会变形
    • 网络图片加载
      控件可以加载网络图片,具体实施是在java文件中完成。
      实现该功能需要先加载第三方的图库工具,本文使用的是Glide。sync的具体方法如下:
      打开bulid.gradle》添加一个repositories {mavenCentral()},在dependencies{}中加入
      implementation ‘com.github.bumptech.glide:glide:4.3.1’
      annotationProcessor ‘com.github.bumptech.glide:compiler:4.3.1’

      //加入这个
      repositories {
          mavenCentral()
      }
      dependencies {
          implementation fileTree(dir: 'libs', include: ['*.jar'])
          implementation 'androidx.appcompat:appcompat:1.1.0'
          implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
          testImplementation 'junit:junit:4.12'
          androidTestImplementation 'androidx.test.ext:junit:1.1.1'
          androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
          //加入这两行
          implementation 'com.github.bumptech.glide:glide:4.3.1'
          annotationProcessor 'com.github.bumptech.glide:compiler:4.3.1'
      }
      

      之后可在ImageView.java中使用,方法为 Glide.with(this).load("").into()
      with内填入的是context,关于context的相关理解,这里可以看一看
      load中填入的是资源图片的url,into填入的是载入图片的view的名称,一般为该类中声明的控件实例。

ListView

目前使用ListView的并不常见,大多都会使用与其功能基本相同的RecyclerView,但本节内容确实有些难理解,本着学习的态度记录下来

  • ListView可以使用一个自设计的item布局,设置item的count,布满整个ListView

    我们首先建立一个listview的包,在包内创建一个ListViewActivity,在xml中新设计一个ListView的框件。之后在AndroidManifest.xml中声明,然后在Main中创建一个文本为ListView的按钮,接着在MainActivity.java中完成该按钮对ListViewActivity的启动。(TextView中已写)
    之后在ListViewActivity中声明ListView这个控件,找到其对应的控件id,并设置其Adapter。
    这里引用下ListView.java中对Adapter的描述:

    * @param adapter The ListAdapter which is responsible for maintaining the
         *        data backing this list and for producing a view to represent an
         *        item in that data set.
    

    可以看到,要想实现item的自我设计,就需要Adapter。
    为了设置Adapter,需要先在包中创建一个MyListAdapter的类,继承BaseAdapter。(Adapter的子类,可以追溯往上直到Adapter,但该类已经可以完成大部分任务)

     private ListView lv_1;
        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_list_view);
            lv_1= findViewById(R.id.lv_1);
            //这里Adapter在初始时是没有的,需要自己另写一个MyListAdapter
            lv_1.setAdapter(new MyListAdapter(ListViewActivity.this));
        }
    

    刚刚创建完后,需要实现抽象父类Adapter的方法,对该类按住Alt+Enter,会帮助自动完成方法实现的基本填写。
    这里有四个方法

    //getCount是设置item的个数的
    @Override
        public int getCount() {
            return 0;
        }
    
        @Override
        public Object getItem(int position) {
            return null;
        }
    
        @Override
        public long getItemId(int position) {
            return 0;
        }
        //重点使用getView,该方法完成item的布局
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            return null;
        }
    }
    

    getView方法中的convertView是一个带有缓存的view,它可以携带一个view内的配置信息。我们只要将item的自设计layout转换成view后,将该view的内部配置信息通过 convertView传给ListViewActivity就可完成这个item的布局。
    这里我们引进一个LayoutInflater,它可以将view实例化。我们可以通过from方法获取ListView的context来获取其场景,再使用inflate方法,将编写好的item布局充入该view中。
    为了通过LayoutInflater获取ListViewActivity的context,我们需要通过构造函数的参数获取context。
    private Context mContext;
    private LayoutInflater mLayoutInflater;
    MyListAdapter(Context context){
    this.mContext = context;
    mLayoutInflater = LayoutInflater.from(context);
    }
    首先在ListViewActivity中,给ListView设置Adapter:
    lv_1.setAdapter(new MyListAdapter(ListViewActivity.this));
    之后在MyListAdapter中,完成getView()的具体实现:

    //创一个ViewHolder是为了避免重复使用findVieByid,提高性能
     static class ViewHolder {
     	//这里是item布局中用到的几个控件
        public ImageView imageView;
        public TextView TVtitle, TVtime, TVcontent;
    }
    
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder = null;
        if (convertView == null) {
        	//将layout_list_item充入ListView的XML布局
            convertView = mLayoutInflater.inflate(R.layout.layout_list_item, null);
            holder = new ViewHolder();
            //这里findViewByid仅在第一个item的构建时使用,之后直接使用convertView已设的Tag
            holder.imageView = convertView.findViewById(R.id.list_item_iv);
            holder.TVtitle = convertView.findViewById(R.id.tv_title);
            holder.TVtime = convertView.findViewById(R.id.tv_time);
            holder.TVcontent = convertView.findViewById(R.id.tv_content);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }
        //给控件赋值
        holder.TVtitle.setText("这是标题");
        holder.TVtime.setText("2020/2/28");
        holder.TVcontent.setText("这是内容");
        Glide.with(mContext).load("https://dss0.bdstatic.com/5aV1bjqh_Q23odCf/static/superman/img/logo/logo_white-c4d7df0a00.png").into(holder.imageView);
        return convertView;
    }
    

    最终成果就是介样啦!
    在这里插入图片描述

学习内容来自 bilibili up主天哥在奔跑的Android开发教程,感谢天哥的视频

UI组件

AdapterView及其子类

  • AdapterView的具体功能职责
  1. AdapterView首先是一个容器,内部可以防止很多个item,item可以是单个控件,也可以是集成式的功能模块
  2. AdapterView是一类view的统称,他们都借助了Adapter来完成item的装填工作,自定义美化和相关配置
  3. 装填的方法是setAdapter(Adapter adapter),每个类AdapterView都是它的子类
  4. 可以通过xml属性中的entries,在数组资源中定义一些item的信息列表,但仅能进行少量信息设置。也可以通过增加Adapter的形参,可以传入自定义item的list,完成自定义。
ListView
  • ListView和ListActivity
    ListVIew在前面章节已经阐述过其基本操作流程。
    这里指出,生成列表视图有两种方式,上面所说的是第一种方式:
    1.直接使用ListView进行创建
    2.让Activity继承ListActivity,相当于该Activity显示的组件为ListView

  • 实际中创建ListView的四种方式

  1. 使用ArrayAdapter继承ListActivity完成创建
    ArrayAdapter需要准备三项,上下文,item布局和数据源。
  2. 继承ListActivity完成创建
    Activity继承ListActivity后,它不需要设置指定layout来绘制view,它本身会显示这个listview。这是与其他方式不同的主要区别,它不需要为listview进行fb。
    至于Adapter的适配,根据使用的Adapter类型来考虑。
  3. 使用SimpleAdapter
 * @param context The context where the View associated with this SimpleAdapter is running
     * @param data A List of Maps. Each entry in the List corresponds to one row in the list. The
     *        Maps contain the data for each row, and should include all the entries specified in
     *        "from"
     * @param resource Resource identifier of a view layout that defines the views for this list
     *        item. The layout file should include at least those named views defined in "to"
     * @param from A list of column names that will be added to the Map associated with each
     *        item.
     * @param to The views that should display column in the "from" parameter. These should all be
     *        TextViews. The first N views in this list are given the values of the first N columns
     *        in the from parameter.
SimpleAdapter(Context context, List<? extends Map<String, ?>> data,@LayoutRes int resource, String[] from, @IdRes int[] to) 

我们说明一下它的几个参数。
第一个,上下文。
第二个,数据源,一般是一个List<map<String,?>>的数据类型。其中String这个key值指的是这个数据的类型,即是一个item中哪个控件所需要的数据。
第三个,item布局的layout文件。
第四个,这个from[]指的是一个item需要装的数据(其中每一个元素的顺序与第五个to[]的顺序是挂钩的,表示该元素将填充到相应顺序所代表的控件中)
第五个,to[]。指定一个item中需填充的所有部件,其元素顺序与from[]的元素排序关联。
关于四五两个参数,打个比方,现在有一台电脑,一件衣服,一瓶可乐。
我要把他们进行收纳,可以使用程序来完成。那么,收纳的空间,应该按顺序指定为电脑桌,衣柜和冰箱。
4. 使用BaseAdapter及其自定义子类
BaseAdapter是一个需要实现四个方法的Adapter,具体的使用和配置在ListView那节有讲到。重点讲一下getView方法。

* 
     * @param position The position of the item within the adapter's data set of the item whose view
     *        we want.
     * @param convertView The old view to reuse, if possible. Note: You should check that this view
     *        is non-null and of an appropriate type before using. If it is not possible to convert
     *        this view to display the correct data, this method can create a new view.
     *        Heterogeneous lists can specify their number of view types, so that this View is
     *        always of the right type (see {@link #getViewTypeCount()} and
     *        {@link #getItemViewType(int)}).
     * @param parent The parent that this view will eventually be attached to
     * @return A View corresponding to the data at the specified position.
     */
    View getView(int position, View convertView, ViewGroup parent);
  • positon
    表示是第几个item
  • convertview
    一个带有储存功能的view,可用来储存已经使用过的view的配置信息。如第一个item已经勾画好了它的view配置,可以通过convertview来读取第一个item的配置信息(如控件绑定信息),可以减少findviewbyid等命令的重复使用。
  • parent
    指这个listview所依附的view,即它的父布局框架。
AutoCompleteTextView

AutoCompleteTextView是EditText的子类,它比输入框多一个功能,即输入一定字符时,该控件会弹出一个根据输入内容自动填写选项的下拉菜单,供用户选择。
下拉菜单的自动完成,依赖于Adapter的数据填入。
在Adapter中填入一组数据后,如若向控件填入相关的一定字符,会自动弹出相关字符。打个比方,Adapter数据为123456,对输入框输入1,会弹出下拉菜单,其中有一项将显示123456,点击后将其填入。

  • completionThreshold / setThreshold(int)
    至少输入几个字符弹出下拉菜单
  • completionHint / setCompletionHint(Charsequence)
    设置下拉菜单的提示文字
  • Adapter
    AutoCompleteTextView可直接使用ArrayAdapter来提供显示文本。
    它还派生出一个子类MultiAutoCompleteTextView。该子类允许输入多个提示项,提示项间以分隔符分隔。
    该子类多了一个方法setTokenizer(),可填入new MultiAutoCompleteTextView.CommaTokenizer()设置逗号为分隔符。
    在这里插入图片描述
GridView

网格分布的列表,可自由设置列数,当numColumns=1时,就是ListView了。
首先说明一下它的几个Xml属性

  • columnWidth / setColumnWidth(int)
    设置列宽度
  • numColumns / setNumColunms(int)
    设置列数
  • horizontalSpacing/verticalSpacing setHorizontalSpacing/setVerticalSpacing
    设置元素水平/竖直间距

GridView的Adapter配置:
支持BaseAdapter ,SimpleAdapter ,ArrayAdapter等,配置同ListView。
注:设置item的layout时,如使用ImageView,请保证图片格式大小相同。如若图片大小不一致,ImageView需使用固定高度或宽度格式来显示图片。

ExpandableListView

它是ListView的子类,与ListView区别在于,它分有为Group 和Child两种类型的行显示。
点击Group行,会向下伸缩child行的items。为了实现这个功能,用到了Adapter来对group和child进行分别设置。具体功能可看下图
在这里插入图片描述
使用该控件需要实现ExpandableListAdapter。实现它有以下三种方式:

  1. 扩展BaseExpandableListAdapter实现
  2. 使用SimpleExpandableListAdapter将两个List集合包装成ExpandableListAdapter(由于需要设置group和child,所以要使用两个List集合将数据源封装进来)
  3. 使用SimpleCursorTreeAdapter将Cursor中数据包装成SimpleCursTreeAdapter

ExpandableListAdapter需要实现的主要方法如下:
abstract long getChildId(int groupPosition, int childPosition)
Gets the ID for the given child within the given group.

abstract View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent)
Gets a View that displays the data for the given child within the given group.

abstract int getChildrenCount(int groupPosition)
Gets the number of children in a specified group.

abstract Object getGroup(int groupPosition)
Gets the data associated with the given group.

abstract int getGroupCount()
Gets the number of groups.

abstract long getGroupId(int groupPosition)
Gets the ID for the group at the given position.

abstract View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent)
Gets a View that displays the given group.

ProgressBar及其子类

progressBar

Android提供多种风格的进度条,通过style可以指定风格。有以下几个属性值:
1.Widget.ProgressBar.Horizontal 水平进度条
2..Inverse 环形进度条
3.
.Large 大环形进度条
相关xml属性:
android:max 设置进度条最大值
android:progress 设置进度条当前进度值
android:progressDrawable 设置进度条轨道的drawable
android:indeterminate 设置true时不精确显示进度
android:indeterminate 设置绘制不显示进度的drawable
andrpid:indeterminateDuration 设置不精确显示进度的持续时间

SeekBar

用户可拖动改变一个值。

  • android:thumb 自定义滑块
RatingBar

相当于自定义滑块默认为星星。

ViewAnimator及其子类

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值