• 《第一行代码》第三章


    《第一行代码》第三章

    界面编写实践——聊天界面在下一篇

    控件篇

    TextView

    • 简单介绍了TextView的几个属性,其余可查阅文档即可

      <TextView
              android:id="@+id/text_view"
              android:layout_width="match_parent"
              android:layout_height="wrap_content"
          android:gravity="center"	
          android:textSize="24sp"
          android:textColor="#00ff00"
              android:text="Hello World!" />
      
    • "match_parent" 为适应父布局, "wrap_content" 为刚好包住文字,即文字大小

    • android:gravity="center" 设置文本位置; android:textSize="24sp" 设置文字大小,以sp为单位; android:textColor="#00ff00" 设置颜色。

    Button

    TextView

    • <EditText
             android:id="@+id/edit_text"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
             android:hint="Type something here"
             android:maxLines="2"
             android:text="Name" />
      
    • android:hint="Type something here" 为提示信息;android:maxLines="2" 为最大行数。

    ImageView

    <ImageView
        android:id="@+id/image_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/img_1"/>
    
    • 修改主活动代码,完成以下效果:

      展开查看
       private EditText editText;
          private ImageView imageView;
          @Override
          protected void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.activity_main);
              Button button = (Button) findViewById(R.id.button);
              button.setOnClickListener(this);
              imageView = (ImageView) findViewById(R.id.image_view);
              editText = (EditText) findViewById(R.id.edit_text);
      }@Override
      public void onClick(View view) {
          switch (view.getId()) {
              case R.id.button:
                  imageView.setImageResource(R.drawable.img_2);
                  break;
              default:
                  break;
          }
      }
    • <ProgressBar
             android:id="@+id/progress_bar"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
             style="?android:attr/progressBarStyleHorizontal"	//设置样式,指定水平进度条,可省
           android:max="100"	//给进度条设置最大值
             />
      
    • 所有的Android 控件都可以通过android:visibility 进行指定,可选值有三种:visible、invisible 、gone。gone 表示控件不仅不可见,而且不在占用任何屏幕空间。

    • 使用 setVisibility()方法可以传入 View.VISIBLE、View.INVISIBLE、View.GONE 来控制可见性。

    • 修改主活动case,完成以下效果:

      展开查看
      case R.id.button:
                      int progress = progressBar.getProgress();
                      progress = progress + 10;
                      progressBar.setProgress(progress);
                      break;
    • 通过AlerDialog.Builder 创建一个AlertDialog 的实例,然后可以为这个对话框设置标题、内容、可否取消等属性。

    • 修改case:

      case R.id.button:
          AlertDialog.Builder dialog = new AlertDialog.Builder(MainActivity.this);
          dialog.setTitle("This is Dialog");
          dialog.setMessage("Something important.");
          dialog.setCancelable(false);
          dialog.setPositiveButton("OK",new DialogInterface.OnClickListener(){	//设置确定按钮
              @Override
              public void onClick(DialogInterface dialogInterface, int i) {
              }
          });
          dialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {	//设置取消按钮
              @Override
              public void onClick(DialogInterface dialogInterface, int i) {
              }
          });
          dialog.show();
          break;
      

    ProgressDialog

    • 修改case:

      case R.id.button:
          ProgressDialog progressDialog = new ProgressDialog(MainActivity.this);
          progressDialog.setTitle("This is a ProgressDialog");
          progressDialog.setCancelable(true);	//设为true即返回就取消
          progressDialog.show();
          break;
      

    ListView

    • 主活动:

      展开查看
       
      public class MainActivity extends AppCompatActivity {
          private String[] data = {
                  "Apple","aa","bb","cc","dd","ee","ff","gg","aa","bb","cc","aa","bb","cc","aa","bb","cc"
          };
      @Override
      protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_main);
          ArrayAdapter adapter = new ArrayAdapter(
                  MainActivity.this, android.R.layout.simple_list_item_1, data);
          ListView listView = (ListView) findViewById(R.id.list_view);
          listView.setAdapter(adapter);
      }
      }
      

    定制ListView

    • 写Fruit类

      展开查看
       
      package com.example.ullayouttest;
      public class Fruit {
          private String name;
          private  int imageId;
          public Fruit(String name,int imageId){
              this.name = name;
              this.imageId = imageId;
          }
          public String getName(){
              return name;
          }
          public int getImageId(){
              return imageId;
          }
      }
      
    • 重写适配器

      public class FruitAdapter extends ArrayAdapter<Fruit> {
          private int resourceId;
          public FruitAdapter(Context context, int textViewResourceId, List<Fruit> objects){
              super(context,textViewResourceId,objects);
              resourceId = textViewResourceId;
          }
          public View getView(int position, View convertView, ViewGroup parent){
              Fruit fruit = getItem(position);
              View view = LayoutInflater.from(getContext()).inflate(resourceId,parent,false);
             //以下布局里传入图片与名字
              ImageView fruitImage = (ImageView) view.findViewById(R.id.fruit_image);
              TextView fruitName = (TextView) view.findViewById(R.id.fruit_name);
              fruitImage.setImageResource(fruit.getImageId());
              fruitName.setText(fruit.getName());
              return view;
          }
      }
      
    • 修改主活动:

      public class MainActivity extends AppCompatActivity {
          private List<Fruit> fruitList = new ArrayList<>();
          @Override
          protected void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.activity_main);
              //主要
              initFruits();
              FruitAdapter adapter = new FruitAdapter(MainActivity.this,R.layout.fruit_item,fruitList);
              ListView listView = (ListView) findViewById(R.id.list_view);
              listView.setAdapter(adapter);
              //放进ListView
          }
          private void initFruits(){
              for (int i=0;i<2;i++){
                  Fruit 南瓜 = new Fruit("南瓜",R.drawable.nangua);
                  fruitList.add(南瓜);
                  Fruit 土豆 = new Fruit("土豆",R.drawable.tudou);
                  fruitList.add(土豆);
                  Fruit 芒果 = new Fruit("芒果",R.drawable.mangguo);
                  fruitList.add(芒果);
                  Fruit 菠萝 = new Fruit("菠萝",R.drawable.boluo);
                  fruitList.add(菠萝);
                  Fruit 蘑菇 = new Fruit("蘑菇",R.drawable.mogu);
                  fruitList.add(蘑菇);
                  Fruit 西瓜 = new Fruit("西瓜",R.drawable.xigua);
                  fruitList.add(西瓜);
                  Fruit 饮料 = new Fruit("饮料",R.drawable.yinliao);
                  fruitList.add(饮料);
              }
          }
      }
      
    • 布局fruit_item:

      <?xml version="1.0" encoding="utf-8"?>
      <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
          android:orientation="vertical" android:layout_width="match_parent"
          android:layout_height="wrap_content">
          <ImageView
              android:id="@+id/fruit_image"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"/>
          <TextView
              android:id="@+id/fruit_name"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:layout_gravity="center_vertical"
              android:layout_marginLeft="10dp"/>
      
      </LinearLayout>
      
    • 主布局:

      <?xml version="1.0" encoding="utf-8"?>
      <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
          android:layout_width="match_parent"
          android:layout_height="match_parent">
         />
          <ListView
              android:id="@+id/list_view"
              android:layout_width="match_parent"
              android:layout_height="match_parent"/>
      </LinearLayout>
      

    • 修改主活动,优化并加入点击事件(程序不久后自动退出了??)

      public class MainActivity extends AppCompatActivity {
          private List<Fruit> fruitList = new ArrayList<>();
      
      
          @Override
          protected void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.activity_main);
              //主要
              initFruits();
              FruitAdapter adapter = new FruitAdapter(MainActivity.this,R.layout.fruit_item,fruitList);
              ListView listView = (ListView) findViewById(R.id.list_view);
              listView.setAdapter(adapter);
              listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                  @Override
                  public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                      Fruit fruit = fruitList.get(position);
                      Toast.makeText(MainActivity.this,fruit.getName(),
                              Toast.LENGTH_SHORT).show();
      
                  }
              });
          }
      

    更强大的滚动控件——RecyclerView

    • 修改主活动中onCreate

      public class MainActivity extends AppCompatActivity {
          private List<Fruit> fruitList = new ArrayList<>();
          @Override
          protected void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.activity_main);
              //主要
              initFruits();
              RecyclerView recyclerView = (RecyclerView) findViewById(R.id.rc_list);
              LinearLayoutManager layoutManager = new LinearLayoutManager(this);
             recyclerView.setLayoutManager(layoutManager);
              FruitAdapter adapter = new FruitAdapter(fruitList);
              recyclerView.setAdapter(adapter);
      
          }
      
    • 修改FruitAdapter:

      展开
      
      package com.example.ullayouttest;
      import android.content.Context;
      import android.view.LayoutInflater;
      import android.view.View;
      import android.view.ViewGroup;
      import android.widget.ArrayAdapter;
      import android.widget.ImageView;
      import android.widget.TextView;
      import androidx.annotation.NonNull;
      import androidx.recyclerview.widget.RecyclerView;
      import java.util.List;
      public class FruitAdapter extends RecyclerView.Adapter {
          private List mFruitList;
          static class ViewHolder extends RecyclerView.ViewHolder{
              ImageView fruitImage;
              TextView fruitName;
              public ViewHolder(View view){
                  super(view);
                  fruitImage = (ImageView) view.findViewById(R.id.fruit_image);
                  fruitName = (TextView)view.findViewById(R.id.fruit_name);
              }
          }
          public FruitAdapter(List fruitList){
              mFruitList = fruitList;
          }
          @NonNull
          @Override
          public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
              View view = LayoutInflater.from(parent.getContext())          .inflate(R.layout.fruit_item,parent,false);
              ViewHolder holder = new ViewHolder(view);
              return holder;
          }
          @Override
          public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
              Fruit fruit = mFruitList.get(position); holder.fruitImage.setImageResource(fruit.getImageId());
              holder.fruitName.setText(fruit.getName());
          }
          @Override
          public int getItemCount() {
              return mFruitList.size();
          }
      }
      
    • 主布局(书里的是android.support.xxx):

      <?xml version="1.0" encoding="utf-8"?>
      <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
      android:layout_width="match_parent"
      android:layout_height="match_parent">
      />
          <androidx.recyclerview.widget.RecyclerView
              android:id="@+id/rc_list"
              android:layout_width="match_parent"
              android:layout_height="match_parent" />
      </LinearLayout>
      

    横向

    • 修改fruit_item 布局

      <?xml version="1.0" encoding="utf-8"?>
      <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
          android:orientation="vertical" 
          android:layout_width="100dp"
          android:layout_height="wrap_content">
          <ImageView
              android:id="@+id/fruit_image"
              android:layout_width="70dp"
              android:layout_height="70dp"
              android:layout_gravity="center_horizontal"
              />
          <TextView
              android:id="@+id/fruit_name"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:layout_gravity="center_horizontal"
              android:layout_marginLeft="10dp"/>
      
      </LinearLayout>
      
    • 在主活动OnCreate中添加 layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL); 语句

    瀑布流

    • 修改主活动,修改的主要代码只有一句,即 StaggeredGridLayoutManager layoutManager 修改成瀑布流。

      展开
      
      public class MainActivity extends AppCompatActivity {
          private List fruitList = new ArrayList<>();
          @Override
          protected void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.activity_main);
              initFruits();
              RecyclerView recyclerView = (RecyclerView) findViewById(R.id.rc_list);
              StaggeredGridLayoutManager layoutManager = new StaggeredGridLayoutManager(3,StaggeredGridLayoutManager.VERTICAL);
             recyclerView.setLayoutManager(layoutManager);
              FruitAdapter adapter = new FruitAdapter(fruitList);
              recyclerView.setAdapter(adapter);
          }
          private void initFruits(){
              for (int i=0;i<2;i++){
                  Fruit 南瓜 = new Fruit( getRandomLengthName("南瓜"),R.drawable.nangua);
                  fruitList.add(南瓜);
                  Fruit 土豆 = new Fruit(getRandomLengthName("土豆"),R.drawable.tudou);
                  fruitList.add(土豆);
                  Fruit 芒果 = new Fruit(getRandomLengthName("芒果"),R.drawable.mangguo);
                  fruitList.add(芒果);
                  Fruit 菠萝 = new Fruit(getRandomLengthName("菠萝"),R.drawable.boluo);
                  fruitList.add(菠萝);
                  Fruit 蘑菇 = new Fruit(getRandomLengthName("蘑菇"),R.drawable.mogu);
                  fruitList.add(蘑菇);
                  Fruit 西瓜 = new Fruit(getRandomLengthName("西瓜"),R.drawable.xigua);
                  fruitList.add(西瓜);
                  Fruit 饮料 = new Fruit(getRandomLengthName("饮料"),R.drawable.yinliao);
                  fruitList.add(饮料);
              }
          }
          private String getRandomLengthName(String name){
              Random random = new Random();
              int length = random.nextInt(20) + 1;
              StringBuilder builder = new StringBuilder();
              for(int i = 0;i<length;i++){ builder.append(name);
              }
              return= builder.tostring();
          }
      }
      
    • 瀑布流添加事件:与ListView有所不同,需要给子项具体的View添加点击事件

      展开
      
      public class FruitAdapter extends RecyclerView.Adapter {
          private List mFruitList;
          static class ViewHolder extends RecyclerView.ViewHolder{
              View fruitView;
              ImageView fruitImage;
              TextView fruitName;
              public ViewHolder(View view){
                  super(view);
                  fruitView = view;
                  fruitImage = (ImageView) view.findViewById(R.id.fruit_image);
                  fruitName = (TextView)view.findViewById(R.id.fruit_name);
              }
          }
          public FruitAdapter(List fruitList){
              mFruitList = fruitList;
          }
          @NonNull
          @Override
          public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
              View view = LayoutInflater.from(parent.getContext())
                     .inflate(R.layout.fruit_item,parent,false);
              final ViewHolder holder = new ViewHolder(view);
              holder.fruitView.setOnClickListener(new View.OnClickListener() {
                  @Override
                  public void onClick(View view) {
                      int position = holder.getAdapterPosition();
                      Fruit fruit = mFruitList.get(position);
                      Toast.makeText(view.getContext(),"you clicked view"+fruit.getName(),Toast.LENGTH_SHORT).show();
                  }
              });
              holder.fruitImage.setOnClickListener(new View.OnClickListener() {
                  @Override
                  public void onClick(View view) {
                      int position = holder.getAdapterPosition();
                      Fruit fruit = mFruitList.get(position);
                      Toast.makeText(view.getContext(),"you clicked image"+fruit.getName(),Toast.LENGTH_SHORT).show();
                  }
              });
              return holder;
          }
          @Override
          public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
              Fruit fruit = mFruitList.get(position);
              holder.fruitImage.setImageResource(fruit.getImageId());
              holder.fruitName.setText(fruit.getName());
          }
          @Override
          public int getItemCount() {
              return mFruitList.size();
          }
      }
      

    布局篇

    线性布局——LinearLayout

    • 通过 android:orientation="vertical" 可改变为水平排列布局。

    • android:layout_gravity 用于指定控件在布局中的对齐方式。

    • android:layout_weight 可使用比例的方式来指定控件的大小。

    相对布局——RelativeLayout

    • <!--相对父布局进行对齐-->
      android:layout_alignParentLeft="true"
      android:layout_alignParentTop="true"
      android:layout_alignParentBottom="true"
      android:layout_alignParentRight="true"
      android:layout_centerInParent="true"
      
    • <!--相对控件进行对齐-->
      android:layout_above="@id/button3"
      android:layout_toLeftOf="@id/button3"
      android:layout_below="@id/button3"
      android:layout_toRightOf="@id/button3"
      

              

    帧布局——FrameLayout

    • 所有的控件都默认摆放在布局的左上角

    百分比布局

    • 百分比布局————android.support.percent.PercentFrameLayout

      layout_widthPercent="50%"
      layout_heightPercent="50%"
      

    自定义

    自定义布局

    image-20200804121650704

    • 当要添加标题栏,主活动中:

      ActionBar actionBar = getSupportActionBar();
      if(actionBar != null){
          actionBar.hide();
          
      }
      
    • 主活动布局添加:

      <include layout="@layout/title"/>
      
    • 布局:

      android:background="@drawable/title"
      

    自定义控件

    1. 添加新的布局

      <?xml version="1.0" encoding="utf-8"?>
      <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
          android:layout_width="match_parent"
          android:layout_height="wrap_content"
          android:background="@drawable/title">
          <Button
              android:id="@+id/back"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:layout_gravity="center"
              android:layout_margin="5dp"
              android:background="@drawable/back"
              android:text="Back"
              android:textColor="#fff"/>
          <TextView
              android:id="@+id/text"
              android:layout_width="0dp"
              android:layout_height="wrap_content"
              android:layout_gravity="center"
              android:layout_weight="1"
              android:gravity="center"
              android:text="Title Text"
              android:textColor="#fff"
              android:textSize="24sp"/>
          <Button
              android:id="@+id/edit"
              android:layout_width="wrap_content"
              android:layout_height="fill_parent"
              android:layout_gravity="center"
              android:layout_margin="5dp"
              android:background="@drawable/edit"
              android:text="Edit"
              android:textColor="#fff"/>
      </LinearLayout>
      
    2. 新建活动并写好相应的功能

      展开查看
      
      package com.example.ullayouttest;
      import android.app.Activity;
      import android.content.Context;
      import android.util.AttributeSet;
      import android.view.LayoutInflater;
      import android.view.View;
      import android.widget.Button;
      import android.widget.LinearLayout;
      import android.widget.Toast;
      public class TitleLayout extends LinearLayout {
          public TitleLayout(Context context, AttributeSet attrs){
              super(context,attrs);
              LayoutInflater.from(context).inflate(R.layout.title,this);
              Button titleBack = (Button) findViewById(R.id.back);
              Button titleEdit = (Button) findViewById(R.id.edit);
              titleBack.setOnClickListener(new OnClickListener() {
                  @Override
                  public void onClick(View view) {
                      ((Activity)getContext()).finish();
                  }
              });
              titleEdit.setOnClickListener(new OnClickListener() {
                  @Override
                  public void onClick(View view) {
                      Toast.makeText(getContext(), "you clicked edit button", Toast.LENGTH_SHORT).show();
                  }
              });
          }
      }
      
    3. 接下来当作普通控件使用即可

      <com.example.ullayouttest.TitleLayout
          android:layout_width="match_parent"
          android:layout_height="wrap_content"/>
      
  • 相关阅读:
    坐标系操作
    创建重复字符的字符串
    添加和读取扩展数据
    GDI+ 透明画刷
    AutoCAD将焦点设置为绘图窗口
    DataGridView复制到Excel格式
    VB.NET 如何使用AutoCAD事件
    DataGridView禁用行标题中的三角号
    day80-drf-web开发模式、api接口、postman的使用、Restful规范(重点)、drf的安装和简单使用 、cbv源码、APIView源码分析
    day81-drf-序列化组件、简单使用、字段类型、字段选项、修改数据、read_only、write_only、查询所有、新增、删除、模型类序列化、源码分析
  • 原文地址:https://www.cnblogs.com/zzzketi/p/13788718.html
Copyright © 2020-2023  润新知