打印界面相关知识总结


起初开始接触android,从最先的HelloWorld开始,此时我们需要建立一个project文件。在这个工程里面来写HelloWorld的代码和程序。
前提是在已创建好的工程中来写代码。首先我们来介绍一下project>android>app中几个关键的目录:

(1)src 目录用于存放代码。
(2)gen 目录用于存放对应该资源文件的代码。
(3)res 目录用于存放资源文件。
(4)res\layout 目录用于存放布局描述文件。
(5)res\values 目录用于存放常量定义文件。


        
        
package com.example.administrator.myapplication5;
 
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
public class MainActivity5 extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main5);
}
@Override
protected void onStart() {
super.onStart();
}
@Override
protected void onResume() {
super.onResume();
}
@Override
protected void onPause() {
super.onPause();
}
@Override
protected void onStop() {
super.onStop();
}
@Override
protected void onDestroy() {
super.onDestroy();
}
}
         
         
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.administrator.myapplication5.MainActivity5">
 
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!" />
</RelativeLayout>
          
          
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.administrator.myapplication5">
 
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity5">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
 
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
 
</manifest>

从以上的代码中我们可以知道HelloWorld的程序需要创建一个子类和两个xml布局文件才能完整的显示这个界面。在创建这个类 MainActivity5中复写了生命周期的方法onCreate(), onStart () , onResume () , onPause () , onStop () onDestroy ()。在写代码的过程中我们需要注意以下几点:
(1) setContentView(R.layout.activity_main5)中R.layout.需与布局文件名一致,否则会报错,如果你更改了布局文件名,那么相应的在主程序中也应做相应的修改。
(2)在manifest.xml文件中需要注意的是: <activity android:name=".MainActivity5">,名字需与创建的子类名保持一致。否则也会报错。

一.要完成一个简单界面的编写,我们需要了解activity,layout布局,listview,button,Adapter的相关的知识点。

1.1 activity

如上所述,一个简单的activity界面需要创建一个子类,两个布局文件,分别是activity_main5.xml和Androidmanifest.xml文件,后者是你每次添加一个Activity都需要在这个文件中描述一下,整个项目的结构都由这个文件控制,布局是由XML控制的。

1.1.1创建一个LinearLayout

在Android Studio中,从res/layout目录打开activity_my.xml文件。上一节创建新项目时生成的BlankActivity,包含一个activity_my.xml文件,该文件根元素是一个包含TextView的RelativeLayout。

Preview面板点击image关闭右侧Preview面板,在Android Studio中,当打开布局文件时,可以看到一个Preview面板,点击这个面板中的标签,可利用WYSIWYG(所见即所得)工具在Design面板看到对应的图形化效果,但在本节直接操作XML文件即可。

3 删除 TextView 标签.

4 把 RelativeLayout 标签改为 LinearLayout.

5 为< LinearLayout >添加 android:orientation 属性并设置值为 "horizontal".

6 去掉android:padding 属性和tools:context 属性.

修改后结果如下:

res/layout/activity_my.xml

         
         
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal" >
</LinearLayout>

LinearLayoutViewGroup的一个子类,用于放置水平或者垂直方向的子视图部件,放置方向由属性android:orientation设定。LinearLayout里的子布局按照XML里定义的顺序显示在屏幕上。所有的Views都需要用到android:layout_widthandroid:layout_height这两个属性来设置自身的大小。由于LinearLayout是整个视图的根布局,所以其宽和高都应充满整个屏幕的,通过指定width 和 height属性为"match_parent"。该值表示子View扩张自己width和height来匹配父控件的width和height。

1.1.2添加一个文本输入框Textview

与其它View一样,我们需要设置XML里的某些属性来指定EditText的属性值,以下是应该在线性布局里指定的一些属性元素:

1 在activity_my.xml文件的 < LinearLayout > 标签内定义一个 < EditText > 标签,并设置id属性为@+id/edit_message.

2 设置layout_width和layout_height属性为 wrap_content.

3 设置hint属性为一个string 值的引用edit_message.

代码如下:

res/layout/activity_my.xml

           
           
<EditText android:id="@+id/edit_message"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
各属性说明:

android:id

这是定义View的唯一标识符。可以在程序代码中通过该标识符对对象进行引用,例如对这个对象进行读和修改的操作。当想从XML里引用资源对象的时候必须使用@符号。紧随@之后的是资源的类型(这里是id),然后是资源的名字(这里使用的是edit_message)。

android:layout_width 和android:layout_height

对于宽和高不建议指定具体的大小,使用wrap_content指定之后,这个视图将只占据内容大小的空间。如果你使用了match_parent,这时EditText将会布满整个屏幕,因为它将适应父布局的大小。

1.1.3添加一个按钮Button

1 在 Android Studio里, 编辑 res/layout下的 activity_my.xml 文件.

2 在LinearLayout 内部, 在< EditText >标签之后定义一个< Button >标签.

3 设置Button的width 和 height 属性值为 "wrap_content" 以便让Button大小能完整显示其上的文本.

4 定义button的文本使用android:text 属性,设置其值为之前定义好的 button_send 字符串.

此时的 LinearLayout 看起来应该是这样

res/layout/activity_my.xml

         
         
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal" >
<EditText 
android:id="@+id/edit_message"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="@string/edit_message" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/button_send" />
</LinearLayout>
当前EditText和Button部件只是适应了他们各自内容的大小,如下图所示:

这样设置对按钮来说很合适,但是对于文本框来说就不太好了,因为用户可能输入更长的文本内容。因此如果能够占满整个屏幕宽度会更好。LinearLayout使用权重属性来达到这个目的,你可以使用android:layout_weight属性来设置。

二.1listview

ListView是最经典的控件之一, ListView经常被用在列表显示上,每一个列表项都具有相同的布局,一个ListView通常都有三个要素组成:

  • ListView控件
  • 适配器类,用到了设计模式中的适配器模式,它是视图和数据之间的桥梁,负责提供对数据的访问,生成每一个列表项对于的View。常用的适配器类有:ArrayAdapter,SimpleAdapter和SimpleCursorAdapter。
  • 数据源 当然最重要最复杂的部分就是适配器类的编写和设计,在一些复杂的界面,常常需要对适配器类进行相关逻辑处理。

ListView的常用属性有:

ListView常用方法有:

2.2 Adapter

Adapter适配器分为三种: ArrayAdapter,SimpleAdapter和SimpleCursorAdapter。下面来介绍一下这三种适配器是如何进行数据包装的。

2.2.1 ArrayAdapter

ArrayAdapter顾名思义即:需要把数据放入一个数组以便显示。
布局文件:
           
           
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ListView
android:id="@+id/lv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</RelativeLayout>
MainActivity.java 代码如下:
           
           
public class MainActivity extends Activity {
private ListView listView;//创建一个listview对象;
private String datas[]={ "Sunday", "Monday", "Tuesday", "Wednesday",
"Thursday", "Friday", "Saturday" };//准备数据源
ArrayAdapter<String> adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);//复写生命周期中的onCreate()方法;
requestWindowFeature(Window.FEATURE_NO_TITLE);//隐藏标题栏
setContentView(R.layout.activity_main);
listView=(ListView)findViewById(R.id.lv);
//实例化ArrayAdapter
adapter=new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,datas);
listView.setAdapter(adapter);//设置适配器
}
}
(1)在这段代码中的setContentView()方法起初不知道它的作用是什么?经过查资料之后,对于这个方法的理解仍然觉得有疑惑。

setContentView(R.layout.main)在Android里面,这句话是什么意思?

R.layout.main是个布局文件即控件都是如何摆放如何显示的,setContentView就是设置一个Activity的显示界面,这句话就是设置这个这句话所在的Activity采用R.layout下的main布局文件进行布局
使用setContentView可以在Activity中动态切换显示的View,这样就不需要多个Activity就可以显示不同的界面,因此不再需要在Activity间传送数据,变量可以直接引用。但是,在android SDK给我们建的默认的Hello World程序中,调用的是setContentView(int layoutResID)方法,如果使用该方法切换view,在切换后再切换回,无法显示切换前修改后的样子,也就是说,相当于重新显示一个view,并非是把原来的view隐藏后再显示。其实setContentView是个多态方法,我们可以先用LayoutInflater把布局xml文件引入成View对象,再通过setContentView(View view)方法来切换视图。因为所有对View的修改都保存在View对象里,所以,当切换回原来的view时,就可以直接显示原来修改后的样子。
对于上面的这段话,我的理解是:setContentView()方法顾名思义就是设置一个Activity的显示界面,这个方法是你在复写onCreate()方法时所获得的,在布局文件中有多种的view,例如:Textview,Listview,Imgview等view,这些view都是在布局文件所填充的内容。假如你在布局写几个Textview,那么布局中就会显示几个。如果你对里面的view做相应的修改,那么此时布局中的内容也会做相应的修改。
(2)ArrayAdapter中的参数解析:ArrayAdapter对象传入了三个参数,第一个参数是上下文对象(在这里指的是MainActivity),第二个参数是子项布局,这里调用了系统内容的布局(在这里指的是上面的布局文件),第三个参数是数据集,这里传入的是字符串数组("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday")。
2.2.2SimpleAdapter适配器
ArrayAdapter适用于显示信息比较单一的场景,若显示项中包含多种形式的数据,就不太适用了,下面我们介绍一下可以适配多种数据类型的适配器类SimpleAdapter的使用方法。当存在多种数据类型时首先要考虑布局问题,因此首先要设置子项目布局文件。
布局文件与ArrayAdapter大相径庭,主程序中不同的地方在于:在设置适配器的过程中所传入的参数不同。
 simpleAdapter=new SimpleAdapter(this,datas,R.layout.animal_layout,new String[]{"img","name"},new int[]{R.id.img,R.id.tv});       
 listView.setAdapter(simpleAdapter);//设置配置器
SimpleAdapter的构造函数如下: SimpleAdapter(Context context, List<? extends Map<String, ?>> data, int resource, String[] from, int[] to) 实例化SimpleAdapter时要传入几个参数:
  • context:即上下文对象,这里传入this,仍然指的是MainActivity
  • data:是一个包裹Map集合的List数据集,这里传入datas,程序初始化的数据集(数据来源是你在程序中定义data的成员函数);
  • resource:子项布局文件,这里是我们自定义的animal_layout.xml文件,传入R.layout.animal_layout;
  • from:是一个字符串数组,字符串指的是Map中的键值,这里有两个键,即“img”和“name”;
  • to:是一个int型数组,表示子项布局中对应控件的id,这里传入ImageView的id-R.id.img和TextView的id-R.id.tv即可。
2.2.3BaseAdapter

从上面的例子可以看出,ArrayAdapter一般适用于数据源数据种类比较单一的情形,若数据类型比较复杂,需要个性化定制布局,则可以采用BaseAdapter适配器进行数据适配。若要问BaseAdapter和SimpleAdapter有什么不同,通过API文档可以获悉,SimpleAdapter是BaseAdapter的子类,BaseAdapter较SimpleAdapter来讲更为灵活。
(1)首先要先对数据进行封装;
(2)定义单个子项布局文件和主布局文件;
(3)BaseAdapter:要对其中的四种方法进行复写getCount(),getItem(),getItemId(),getView
(4)在BaseAdapter中, 为了提高加载效率, 创建了内部类ViewHolder, 可以避免每次调用getView方法时都要通过findViewById方法去实例化控件,大大提高运行效率。

三.应用场景

我们要做一个如下图所示的管理界面:
在做这个界面的过程中,我认为需要注意的问题:数据的传输,数据缓存,布局中的一一对应。难点在于适配器的理解,布局文件的理解也至关重要。
先来看一下代码:
数据源animal类
          
          
package com.example.administrator.printer_listview;
 
/**
* Created by Administrator on 2016/5/24.
*/
public class Animal {
public Animal(String name, String device, String statue, String size, String caozuo) {
this.name = name;
this.device = device;
this.statue = statue;
this.size = size;
this.caozuo = caozuo;
}
private String name;
private String device;
private String statue;
private String size;
private String caozuo;
 
public String getName() {
return name;
}
 
public void setName(String name) {
this.name = name;
}
 
public String getDevice() {
return device;
}
 
public void setDevice(String device) {
this.device = device;
}
 
public String getStatue() {
return statue;
}
 
public void setStatue(String statue) {
this.statue = statue;
}
 
public String getSize() {
return size;
}
 
public void setSize(String size) {
this.size = size;
}
 
public String getCaozuo() {
return caozuo;
}
public void setCaozuo(String caozuo) {
this.caozuo = caozuo;
}
public String toString(){
return super.toString();
}
}
代码分析:根据界面需求,需要传递这五个参数,分别是:name,device,statue,size,caozuo,在创建的Animal类中,定义了五个私有的成员变量,通过set()和get()方法进行封装,获得数据。

创建子类 printer_Activity2
           
           
package com.example.administrator.printer_listview;
 
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.view.Window;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.List;
 
/**
* Created by Administrator on 2016/5/24.
*/
public class printer_Activity2 extends AppCompatActivity {
private ListView listView;
private List<Animal> datas = new ArrayList<Animal>();
private AnimalAdapter animalAdapter;
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);//隐藏标题栏
setContentView(R.layout.activity_printer2);
initDatas();
listView = (ListView) findViewById(R.id.lv);
animalAdapter = new AnimalAdapter(this, datas);//this指的是printer_Activity2
listView.setAdapter(animalAdapter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Toast.makeText(printer_Activity2.this, "您单击了" + datas.get(position).toString(), Toast.LENGTH_SHORT).show();
}
});
}
private void initDatas() {
Animal animal0 = new Animal("1.doxc","HPp1200", "进行中", "2.5M", "pause");
Animal animal1 = new Animal("2.pdf", "Canon MX800", "进行中", "750K", "delete");
datas.add(animal0);
datas.add(animal1);
datas.add(new Animal("3.doxc","hh", "kk", "2.4", "ll"));
datas.add(new Animal("3.doxc","hh", "kk", "2.4", "ll"));
datas.add(new Animal("3.doxc","hh", "kk", "2.4", "ll"));
datas.add(new Animal("3.doxc","hh", "kk", "2.4", "ll"));
}
}
代码分析:创建子类 printer_Activity2 ,定义三个私有的成员变量listview,<Animal>datas,AnimalAdapter,在onCreate()方法中采用setContentView()方法来显示界面,布局用的是
activity_printer2, 定义一个私有的initDatas成员函数来传递参数,即对应name,device,statue,size,caozuo中的参数。 调用了setOnItemClickListener方法实现了单项监听,覆写了onItemClick方法,由参数positon通过List的getPosition方法获取对象,再通过对象封装的getAnimal方法可以获得对应的动物名,由Toast通知输出。

AnimalAdapter
           
           
package com.example.administrator.printer_listview;
 
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.*;
import java.util.List;
 
/**
* Created by Administrator on 2016/5/24.
*/
public class AnimalAdapter extends BaseAdapter {
private Context context;
private List<Animal> datas;
//构造函数需要传入两个必要的参数:上下文对象和数据源
public AnimalAdapter(Context context,List<Animal> datas) {
this.context=context;
this.datas=datas;
}
//返回子项的个数
@Override
public int getCount() {
return datas.size();
}
//返回子项对应的对象
@Override
public Object getItem(int position) {
return datas.get(position);
}
//返回子项的下标
@Override
public long getItemId(int position) {
return position;
}
//返回子项视图
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
Animal animal= (Animal) getItem(position);
View view;
ViewHolder viewHolder;
if(convertView==null){
view = LayoutInflater.from(context).inflate(R.layout.animal_layout,null);
viewHolder=new ViewHolder();
viewHolder.animalName=(TextView)view.findViewById(R.id.name);
viewHolder.animalDevice=(TextView)view.findViewById(R.id.device);
viewHolder.animalStatue=(TextView)view.findViewById(R.id.statue);
viewHolder.animalSize=(TextView)view.findViewById(R.id.size);
view.setTag(viewHolder);//存放数据;
}else{
view=convertView;
viewHolder= (ViewHolder) view.getTag();
}
viewHolder.animalName.setText(animal.getName());
viewHolder.animalDevice.setText(animal.getDevice());
viewHolder.animalStatue.setText(animal.getStatue());
viewHolder.animalSize.setText(animal.getSize());
return view;
}
//创建ViewHolder类
class ViewHolder{
TextView animalName;
TextView animalDevice;
TextView animalStatue;
TextView animalSize;
 
}
}
代码分析:AnimalAdapter继承了BaseAdapter,定义了两个参数,一个是context,另一个List<Animal>datas数据源, 必须需要覆写四个方法,每个方法的具体含义已经在代码中做了注释,这里主要用的方法是getview()方法,在这个方法中定义了三个参数,一个是position,一个是convertView,一个是 ViewGroup parent.
(ListView的原理)ListView中的每一个Item显示都需要Adapter调用一次getView的方法,这个方法会传入一个convertView的参数,返回的View就是这个Item显示的View。如果当Item的数量足够大,再为每一个Item都创建一个View对象,必将占用很多内存,创建View对象(mInflater.inflate(R.layout.lv_item, null);从xml中生成View,这是属于IO操作)也是耗时操作,所以必将影响性能。Android提供了一个叫做Recycler(反复循环器)的构件,就是当ListView的Item从上方滚出屏幕视角之外,对应Item的View会被缓存到Recycler中,相应的会从下方生成一个Item,而此时调用的getView中的convertView参数就是滚出屏幕的Item的View,所以说如果能重用这个convertView,就会大大改善性能。
在以上的代码中:每调用一次getview的方法,此时就会传入一个convertView的参数,判断 convertView是否为空,为空了继续填充,不为空则不会填充,此时屏幕上显示的只是你当前界面上已经填充过的数据,也就是说屏幕最先滑出的数据,会下一次在界面上显示。viewHolder只是将需要缓存的那些view封装好,convertView的getTag将这些数据进行缓存以便于供下次调用。
主布局文件activity_printer2.xml
           
           
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="16dp"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:paddingTop="16dp"
android:orientation="vertical"
tools:context="com.example.administrator.printer_listview.printer_Activity2>
 
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/name"
android:layout_width="50dip"
android:layout_height="30dp"
android:layout_gravity="center"
android:layout_weight="1"
android:text="文档名 "
android:textSize="10sp" />
<TextView
android:id="@+id/device"
android:layout_width="59dp"
android:layout_height="30dp"
android:layout_gravity="center"
android:text="设备 "
android:textSize="10sp" />
<TextView
android:id="@+id/statue"
android:layout_width="50dip"
android:layout_height="30dp"
android:layout_gravity="center"
android:layout_weight="1"
android:text="状态"
android:textSize="10sp" />
<TextView
android:id="@+id/size"
android:layout_width="50dip"
android:layout_height="30dp"
android:layout_gravity="center"
android:layout_weight="1"
android:text="大小 "
android:textSize="10sp" />
<TextView
android:id="@+id/caozuo"
android:layout_width="50dip"
android:layout_height="30dp"
android:layout_gravity="center"
android:layout_weight="1"
android:text="操作 "
android:textSize="10sp" />
</LinearLayout>
<ListView
android:id="@+id/lv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below ="@+id/lv"
android:layout_above="@+id/RelativeLayout"/>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical">
<Button
android:text ="暂停所有"
android:id="@+id/button1"
android:layout_weight="1"
android:gravity="center_horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<Button
android:text ="开始所有"
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_weight="1"
android:layout_toLeftOf="@+id/button1"
android:layout_height="wrap_content" />
<Button
android:text ="取消所有"
android:id="@+id/button3"
android:layout_width="wrap_content"
android:layout_weight="1"
android:layout_toLeftOf="@+id/button2"
android:layout_height="wrap_content" />
<Button
android:text ="完成"
android:id="@+id/button4"
android:layout_width="wrap_content"
android:layout_weight="1"
android:layout_alignParentRight="true"
android:layout_height="wrap_content" />
</RelativeLayout>
</LinearLayout>
代码分析:在这个主布局文件中,显示的是子类printer_Activity2 中界面,主布局文件中配置了ListView,TextView,Button控件,textview中显示的是文本信息填充,根据需求来设置button,并对控件中的属性值做相应的修改。
           
           
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1">
 
<View
android:layout_width="0.5px"
android:layout_height="match_parent"
android:background="#B8B8B8"
android:visibility="visible" />
<TextView
android:id="@+id/name"
android:textSize="10sp"
android:layout_weight="1"
android:layout_width="0dp"
android:layout_gravity="center_horizontal"
android:layout_height="wrap_content"
/>
<View
android:layout_width="0.5px"
android:layout_height="match_parent"
android:background="#B8B8B8"
android:visibility="visible" />
 
<TextView
android:id="@+id/device"
android:textSize="10sp"
android:layout_weight="1"
android:layout_gravity="center_horizontal"
android:layout_width="0dp"
android:layout_height="wrap_content" />
<View
android:layout_width="0.5px"
android:layout_height="match_parent"
android:background="#B8B8B8"
android:visibility="visible" />
<TextView
android:id="@+id/statue"
android:gravity="center_horizontal"
android:textSize="10sp"
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="wrap_content" />
<View
android:layout_width="0.5px"
android:layout_height="match_parent"
android:background="#B8B8B8"
android:visibility="visible" />
 
<TextView
android:id="@+id/size"
android:textSize="10sp"
android:layout_weight="1"
android:layout_width="0dp"
android:layout_gravity="center_horizontal"
android:layout_height="wrap_content" />
 
<Button
android:text="暂停"
android:id="@+id/button5"
android:layout_width="39dp"
android:layout_height="wrap_content" />
 
<Button
android:text="删除"
android:id="@+id/button6"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
 
</LinearLayout>
代码分析:在子项布局文件有三种控件即textview,view,Button控件,textview用来填充文本信息,每一个textview对应一个view目的是为了添加竖线的功能,Button控件中是为了传递成员变量操作中需要设置的暂停和删除的功能。
总结:目前为止,界面的基本功能已经完成,界面不够美观,仍需要做修改。自己对于布局和适配器方面仍需好好学习,android中的控件有很多功能,要掌握还需要好好下功夫揣摩。














  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于微信小程序的家政服务预约系统采用PHP语言和微信小程序技术,数据库采用Mysql,运行软件为微信开发者工具。本系统实现了管理员和客户、员工三个角色的功能。管理员的功能为客户管理、员工管理、家政服务管理、服务预约管理、员工风采管理、客户需求管理、接单管理等。客户的功能为查看家政服务进行预约和发布自己的需求以及管理预约信息和接单信息等。员工可以查看预约信息和进行接单。本系统实现了网上预约家政服务的流程化管理,可以帮助工作人员的管理工作和帮助客户查询家政服务的相关信息,改变了客户找家政服务的方式,提高了预约家政服务的效率。 本系统是针对网上预约家政服务开发的工作管理系统,包括到所有的工作内容。可以使网上预约家政服务的工作合理化和流程化。本系统包括手机端设计和电脑端设计,有界面和数据库。本系统的使用角色分为管理员和客户、员工三个身份。管理员可以管理系统里的所有信息。员工可以发布服务信息和查询客户的需求进行接单。客户可以发布需求和预约家政服务以及管理预约信息、接单信息。 本功能可以实现家政服务信息的查询和删除,管理员添加家政服务信息功能填写正确的信息就可以实现家政服务信息的添加,点击家政服务信息管理功能可以看到基于微信小程序的家政服务预约系统里所有家政服务的信息,在添加家政服务信息的界面里需要填写标题信息,当信息填写不正确就会造成家政服务信息添加失败。员工风采信息可以使客户更好的了解员工。员工风采信息管理的流程为,管理员点击员工风采信息管理功能,查看员工风采信息,点击员工风采信息添加功能,输入员工风采信息然后点击提交按钮就可以完成员工风采信息的添加。客户需求信息关系着客户的家政服务预约,管理员可以查询和修改客户需求信息,还可以查看客户需求的添加时间。接单信息属于本系统里的核心数据,管理员可以对接单的信息进行查询。本功能设计的目的可以使家政服务进行及时的安排。管理员可以查询员工信息,可以进行修改删除。 客户可以查看自己的预约和修改自己的资料并发布需求以及管理接单信息等。 在首页里可以看到管理员添加和管理的信息,客户可以在首页里进行家政服务的预约和公司介绍信息的了解。 员工可以查询客户需求进行接单以及管理家政服务信息和留言信息、收藏信息等。
数字社区解决方案是一套综合性的系统,旨在通过新基建实现社区的数字化转型,打通智慧城市建设的"最后一公里"。该方案以国家政策为背景,响应了国务院、公安部和中央政法会议的号召,强调了社会治安防控体系的建设以及社区治理创新的重要性。 该方案的建设标准由中央综治办牵头,采用"9+X"模式,通过信息采集、案(事)件流转等手段,实现五级信息中心的互联互通,提升综治工作的可预见性、精确性和高效性。然而,当前社区面临信息化管理手段不足、安全隐患、人员动向难以掌握和数据资源融合难等问题。 为了解决这些问题,数字社区建设目标提出了"通-治-服"的治理理念,通过街道社区、区政府、公安部门和居民的共同努力,实现社区的平安、幸福和便捷。建设思路围绕"3+N"模式,即人工智能、物联网和数据资源,结合态势感知、业务分析和指挥调度,构建起一个全面的数据支持系统。 数字社区的治理体系通过"一张图"实现社区内各维度的综合态势可视化,"一套表"进行业务分析,"一张网"完成指挥调度。这些工具共同提升了社区治理的智能化和效率。同时,数字社区还提供了包括智慧通行、智慧环保、居家养老和便民服务等在内的多样化数字服务,旨在提升居民的生活质量。 在硬件方面,数字社区拥有IOT物联网边缘网关盒子和AI边缘分析盒子,这些设备能够快速集成老旧小区的物联设备,实现传统摄像设备的智能化改造。平台优势体现在数字化能力中台和多样化的应用,支持云、边、端的协同工作,实现模块化集成。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值