zoukankan      html  css  js  c++  java
  • 《第一行代码》第三章

    《第一行代码》第三章

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

    控件篇

    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"/>
      
  • 相关阅读:
    【leetcode】106. Construct Binary Tree from Inorder and Postorder Traversal
    【leetcode】105. Construct Binary Tree from Preorder and Inorder Traversal
    【leetcode】236. Lowest Common Ancestor of a Binary Tree
    【leetcode】235. Lowest Common Ancestor of a Binary Search Tree
    【leetcode】352. Data Stream as Disjoint Intervals
    【leetcode】897. Increasing Order Search Tree
    【leetcode】900. RLE Iterator
    BEC listen and translation exercise 26
    BEC listen and translation exercise 25
    BEC listen and translation exercise 24
  • 原文地址:https://www.cnblogs.com/zzzketi/p/13788718.html
Copyright © 2011-2022 走看看