版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1粤嵌教育嵌入式学院常用UI组件V1.02普通UI组件第一节3TextView和EditTextTextView直接继承了View,它还是EditText、Button两个UI的父类。它主要的做用就是显示文本,类似于JLabel。从功能上讲TextView是一个文本编辑器,只是Android关闭了它的文字编辑功能。如果想要编辑文本内容,可以使用其子类:EditText。TextView提供了大量的XML属性,详见AndroidAPI文档。4TextViewAPI文档5TextView和EditTextTextView直接继承了View,它还是EditText、Button两个UI的父类。它主要的做用就是显示文本,类似于JLabel。从功能上讲TextView是一个文本编辑器,只是Android关闭了它的文字编辑功能。如果想要编辑文本内容,可以使用其子类:EditText。TextView提供了大量的XML属性,详见AndroidAPI文档。6TextView属性android:ellipsize属性可支持如下几个属性值none:不进行任何处理start:在文本开头部分进行省略middle:在文本中间部分进行省略end:在文本结尾处进行省略marquee:跑在android:ellipsize马灯的形式显示文本信息(动画横向移动)的属性值为marquee时android:marqueeRepeatLimit设置重复滚动的次数,当值设为marquee_forever时表示无限次。android:focusableInTouchMode:是否在触摸模式下获得焦点android:focusable控件是否能够获取焦点<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="/apk/res/android"android:orientation="vertical"android:layout_width="fill_parent"android:layout_height="fill_parent"><!--设置字体为20pt--><TextViewandroid:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="我爱Java"android:textSize="20pt"/><!--设置中间省略--><TextViewandroid:layout_width="fill_parent"
android:layout_height="wrap_content"android:singleLine="true"
android:text="我爱Java我爱Java我爱Java我爱Java我爱Java我aaaJava"android:ellipsize="middle"/><!--对邮件增加链接--><TextViewandroid:layout_width="fill_parent"
android:layout_height="wrap_content"android:singleLine="true"
android:text="测试kongyeeku@163.com内容"android:autoLink="email"/><!--设置文字颜色、大小,并使用阴影--><TextViewandroid:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="测试文字"android:shadowColor="#0000ff"android:shadowDx="15.0"android:shadowDy="20.0"android:shadowRadius="45.0"android:textColor="#ff0000"android:textSize="25pt"/><!--测试密码框--><TextViewandroid:id="@+id/passwd"android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello"android:password="true"/></LinearLayout>7EditText属性8EditText实验实现一个登录界面(用户名和密码),按回车显示用户名和密码9Button与ImageButtonButton直接继承了View,ImageButton继承了ImageView,主要是在UI界面上生成一个按钮,该按钮可以供用户单击,当用户单击按钮时,按钮会触发一个OnClick事件。Button与ImageButton的区别在于:Button生成的按钮上显示文字,而ImageButton上则显视图片。10ImageButton实验实现定义图片随用户动作改变的按钮<?xmlversion="1.0"encoding="utf-8"?><TableLayoutxmlns:android="/apk/res/android"android:orientation="horizontal"android:layout_width="fill_parent"android:layout_height="fill_parent"><TableRow><!--普通文字按钮--><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:background="@drawable/red"android:text="普通按钮"android:textSize="10pt"/><!--普通图片按钮--><ImageButtonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:src="@drawable/blue"android:background="#000000"/></TableRow><TableRow><!--按下时显示不同图片的按钮--><ImageButtonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:src="@drawable/button_selector"android:background="#000000"/><!--带文字的图片按钮--><Buttonandroid:id="@+id/test"android:layout_width="wrap_content"android:layout_height="wrap_content"android:background="@drawable/button_selector"android:text="带文字的图片按钮"/></TableRow></TableLayout><?xmlversion="1.0"encoding="UTF-8"?><selectorxmlns:android="/apk/res/android"><!--指定按钮按钮下时的图片--><itemandroid:state_pressed="true"android:drawable="@drawable/red"/><!--指定按钮松开时的图片--><itemandroid:state_pressed="false"android:drawable="@drawable/purple"/></selector>11课后练习实现人人网的登录界面12RadioButton和CheckBoxRadioButton(单选按钮)和CheckBox(复选框)都继承了Button按钮,可以直接使用Button支持的各种属性和方法。与普通按钮不同的是,它们多了一个可选的功能,因此多了一个android:checked属性,该属性用于指定RadioButton、CheckBox初始时是否被选中。RadioButton与CheckBox不同之处在于,一组RadioButton只能选择其中一个,因此RadioButton与RadioGroup一起使用。13单选按钮实例用单选控件实现一道单选题,并且提示用户选择是否正确。<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="/apk/res/android"android:orientation="vertical"android:layout_width="fill_parent"android:layout_height="fill_parent"><TextViewandroid:id="@+id/tv"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="android属于哪家公司?"/><!--添加一个RadioGroup控件,垂直摆放--><RadioGroupandroid:id="@+id/rg"android:layout_width="fill_parent"android:layout_height="wrap_content"android:orientation="vertical"><RadioButtonandroid:id="@+id/rb1"android:layout_width="fill_parent"android:layout_height="wrap_content"android:text="google"/><RadioButtonandroid:id="@+id/rb2"android:layout_width="fill_parent"android:layout_height="wrap_content"android:text="apple"/><RadioButtonandroid:id="@+id/rb3"android:layout_width="fill_parent"android:layout_height="wrap_content"android:text="microsoft"/></RadioGroup></LinearLayout>14多选按钮实例实现了一个简单的多选题,用户勾选或者撤销勾选会有相应的提示,点击提交按钮会显示用户勾选的内容以及勾选数量。<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="/apk/res/android"android:orientation="vertical"android:layout_width="fill_parent"android:layout_height="fill_parent"><TextViewandroid:id="@+id/tv"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="你现在的目标有哪些?"/><CheckBoxandroid:id="@+id/cb1"android:layout_width="fill_parent"android:layout_height="wrap_content"android:text="掌握android开发"/><CheckBoxandroid:id="@+id/cb2"android:layout_width="fill_parent"android:layout_height="wrap_content"android:text="找到更好的工作"/><CheckBoxandroid:id="@+id/cb3"android:layout_width="fill_parent"android:layout_height="wrap_content"android:text="身体健康最重要~"/><Buttonandroid:id="@+id/bt"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="提交答案"/><TextViewandroid:id="@+id/tvresult"android:layout_width="fill_parent"android:layout_height="wrap_content"/></LinearLayout>android:layout_height="wrap_content"android:text="身体健康最重要~"/><Buttonandroid:id="@+id/bt"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="提交答案"/><TextViewandroid:id="@+id/tvresult"android:layout_width="fill_parent"android:layout_height="wrap_content"/></LinearLayout><?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="/apk/res/android"android:orientation="vertical"android:layout_width="fill_parent"android:layout_height="fill_parent"><TextViewandroid:id="@+id/tv"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="你现在的目标有哪些?"/><CheckBoxandroid:id="@+id/cb1"android:layout_width="fill_parent"android:layout_height="wrap_content"android:text="掌握android开发"/><CheckBoxandroid:id="@+id/cb2"android:layout_width="fill_parent"android:layout_height="wrap_content"android:text="找到更好的工作"/><CheckBoxandroid:id="@+id/cb3"android:layout_width="fill_parent"android:layout_height="wrap_content"android:text="身体健康最重要~"/><Buttonandroid:id="@+id/bt"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="提交答案"/><TextViewandroid:id="@+id/tvresult"android:layout_width="fill_parent"android:layout_height="wrap_content"/></LinearLayout>15ToggleButton的使用ToggleButton(状态开关按钮)也是由Button派生出来的,与CheckBox复选框相似,也提供两种状态。不过区别在于功能上,ToggleButton通常用于切换程序中的某种状态。16状态开关按钮实例实现一个关灯/开灯功能<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="/apk/res/android"android:orientation="vertical"android:layout_width="fill_parent"android:layout_height="fill_parent"><ToggleButtonandroid:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textOff="关灯"android:textOn="开灯"android:checked="true"/></LinearLayout>17时钟的功能和用法DigitalClock(数字时钟)继承了TextView,也就是说它本身就是文本框,只是它里面显示的内容是当前时间,可以显示秒数。AnalogClock(模拟时钟)继承了View组件,它重写了View的OnDraw方法,它会在View上显示模拟时钟,不会显示当前的秒数。Chronometer是计时器组件,也继承了TextView,它不显示当前时间,它显示的是从某起始时间开始,一共过去了多长时间。18时钟的功能实例显示模拟时钟和数字时钟<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="/apk/res/android"android:orientation="vertical"android:layout_width="fill_parent"android:layout_height="fill_parent"android:gravity="center_horizontal"><!--定义模拟时钟--><AnalogClockandroid:layout_width="wrap_content"
android:layout_height="wrap_content"
/><!--定义数字时钟--><DigitalClockandroid:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="14pt"/></LinearLayout>19Chronometer用法实例当用户单击Button时系统开始计时,当计时超过20秒时停止计时。<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="/apk/res/android"android:orientation="vertical"android:layout_width="fill_parent"android:layout_height="fill_parent"android:gravity="center_horizontal"><Chronometerandroid:id="@+id/test"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="12pt"android:textColor="#ffff0000"/><Buttonandroid:id="@+id/start"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="启动"/></LinearLayout>public
classChronometerTestextendsActivity{ @Override public
voidonCreate(BundlesavedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); //获取计时器组件 finalChronometer
ch=(Chronometer)findViewById(R.id.test); //获取“开始”按钮 Buttonstart=(Button)findViewById(R.id.start); start.setOnClickListener(newOnClickListener() { @Override public
voidonClick(Viewsource) { //设置开始计时时间 ch.setBase(SystemClock.elapsedRealtime()); //启动计时器 ch.start(); } }); ch.setOnChronometerTickListener(newOnChronometerTickListener() { @Overridepublic
voidonChronometerTick(Chronometerch){//如果从开始计时到现在超过了20s。if(SystemClock.elapsedRealtime()-ch.getBase()>20*1000){ ch.stop(); } }});}}if(SystemClock.elapsedRealtime()-ch.getBase()>20*1000){ ch.stop(); } }});}}20ImageView的功能和用法ImageView继承了View组件,它的主要功能就是显示图片,其实它不仅可以显示图片,任何Drawable对象都可使用ImageView来显示。21scaleTyep属性值android:scaleType属性可指定如下属性值:matrix:使用matrix方式进行缩放fitXY:对图片横向、纵向独立缩放,使得该图片完全适应于该ImageView,图片的纵横比可能会改变。fitStart:保持纵横比缩放图片,直到该图片能完全显示在ImageView中,缩放完成后将该图片放在ImageView的左上角。fitCenter:保持纵横比缩放图片,直到该图片能完全显示在ImageView中,缩放完成后将该图片放在ImageView的中央。fitEnd:保持纵横比缩放图片,直到该图片能完全显示在ImageView中,缩放完成后将该图片放在ImageView的右下角。center:把图片放在ImageView的中间,但不进行任何缩放。centerCrop:保持纵横比缩放图片,以使得图片能完全覆盖ImageView。centerInside:保持纵横比缩放图片,以使得ImageView能完全显示该图片。22ImageView的属性三bitmapanddrawable1、Drawable就是一个可画的对象,其可能是一张位图(BitmapDrawable),也可能是一个图形(ShapeDrawable),还有可能是一个图层(LayerDrawable),我们根据画图的需求,创建相应的可画对象2、Canvas画布,绘图的目的区域,用于绘图3、Bitmap位图,用于图的处理23ImageView实例实现图片浏览器,可以改变所查看图片透明度及通过一个小区域来查看图片原始大小24高级UI组件第二节25适配器(Adapter)适配器是一个连接数据和AdapterView的桥梁,通过它能有效地实现数据与AdapterView的分离设置,使AdapterView与数据的绑定更加简便,修改更加方便。26AutoCompleteTextViewAutoCompleteTextView(自动完成文本框)从EditText派生而来,比普通文本编辑框多一个功能:当用户输入一定字符之后,自动完成文本框会显示一个下拉菜单,供用户选择。当用户选择某个菜单项之后,AutoCompleteTextView按用户选择自动填写该文本框。AutoCompleteTextView除了可以使用EditText提供的XML属性和方法外,还支持如下表所示的常用的XML属性。使用AutoCompleteTextView很简单,只要为它设置一个Adapter,该Adapter封装了AutoCompleteTextView预设的提示文本。27AutoCompleteTextView属性28AutoCompleteTextView实例实现一个自动完成文本框,请选择你喜欢的图书29Spinner的功能和用法Spinner(列表选择框)位于android.widget包下,每次只显示用户选中的元素,当用户再次点击时,会弹出选择列表供用户选择,而选择列表中的元素同样来自适配器。Spinner是View类得一个子类。Spinner是ViewGroup的间接子类,因此可以作为容器使用,Spinner支持如下表所示的XML属性。30Spinner的属性31下拉列表实例实现两个弹出菜单列表,一个是单选,另一个是本文,在标题输出点击条目相应信息。32GridView组件应用GridView通常被叫做网络视图,用它能实现视图的网格排列,GridView中有一些比较重要的XML属性。33GridView实例实现人人网的主界面34列表视图(ListView)列表视图(ListView)是一种非常广泛的一种组件,以垂直列表的形式显示所有列表项。创建ListView的两种方法:直接使用ListView进行创建。让Activity继承ListActivityListView常用的XML属性如下:android:choiceMode设置ListView的选择行为android:divider设置ListView列表项的分隔条(可用颜色/Drawable)android:dividerHeight设置分隔条的高度android:entries指定数组资源,将根据数组资源生成ListViewandroid:footerDividersEnabled若为false,不在footView前绘分隔条android:headerDividersEnabled若为false,不在headerView前绘分隔条35基于数组的ListView实现ArrayAdapter有多个构造函数,第一个参数为上下文,第二个参数为一个包含TextView,用来填充ListView的每一行的布局资源ID。第三个参数为ListView的内容。Simple_list_item_1:每个列表项都是一个普通的TextViewSimple_list_item_2:每个列表项都是一个普通的TextView(字体略大)Simple_list_item_checked:每个列表项都是一个已勾选的列表项。Simple_list_item_multiple_choice:每个列表项都是带多选框的文本。Simple_list_item_single_choice:每个列表项都是带多单选按钮的文本。<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="/apk/res/android"android:orientation="vertical"android:layout_width="fill_parent"android:layout_height="fill_parent"><!--直接使用数组资源给出列表项--><ListViewandroid:layout_width="fill_parent"
android:layout_height="wrap_content"
android:entries="@array/books"android:divider="@drawable/red"android:headerDividersEnabled="false"/><!--使用ArrayAdapter提供列表项的ListView--><ListViewandroid:id="@+id/list2"android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:divider="@drawable/green"/></LinearLayout>packagecom.gec.listview;….publicclassArrayAdapterListextendsActivity{ @Override protectedvoidonCreate(BundlesavedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); ListViewlist2=(ListView)findViewById(R.id.list2); //定义一个数组 String[]arr={"孙悟空","猪八戒","牛魔王"}; //将数组包装ArrayAdapter ArrayAdapter<String>arrayAdapter=newArrayAdapter<String>( this,android.R.layout.simple_list_item_1,arr); //为ListView设置Adapter list2.setAdapter(arrayAdapter); }}<?xmlversion="1.0"encoding="UTF-8"?><resources><string-arrayname="books"><item>Java讲义</item><item>Ajax讲义</item><item>XML讲义</item><item>Android讲义</item></string-array></resources>36ListView使用SimpleAdapter列表中展示一些除了文字之外的东西,比如图片等。这时就可以使用SimpleAdapter。使用SimpleAdapter的最大难点在于创建SimpleAdapter对象,它需要5个参数,其中后面4个参数十分关键。第二个参数:该参数应该是一个List<?extendsMap<String,?>>类型的集合对象,该集合中每个Map<String,?>对象生成一个列表项。第三个参数:该参数指定一个界面布局的ID第四个参数:该参数应该是一个String[]类型的参数,该参数决定提取Map<String,?>对象中那些Key对应的value来生成列表项。第五个参数:该参数应该是一个int[]类型的参数,该参数决定使用哪些View组件来组合成一个列表项。37ListView使用BaseAdapter使用BaseAdapter必须写一个类继承它,同时BaseAdapter是一个抽象类,继承它必须实现它的方法。BaseAdapter的灵活性就在于它要重写很多方法。getCount()getItem()getItemId()getView(finalintposition,ViewconvertView,ViewGroupparent)当系统开始绘制ListView的时候,首先调用getCount()方法。得到它的返回值,即ListView的长度。然后系统调用getView()方法,根据这个长度绘制ListView的每一行。38消息提示(Toast)Toast是一种非常方便的提示消息框,它会在程序界面上显示一个简单的提示信息,这个提示框用于向用户生成简单的提示信息。它具有两个特点:Toast提示信息不会获得焦点。Toast提示信息过一段时间会自动消失。使用Toast生成消息的步骤如下:调用Toast的构造器或makeText方法创建一个Toast对象。调用Toast的方法来设置该消息提示的对齐方式、页边距、显示内容等。调用Toast的show()方法将它显示出来。一般用Toast显示文本信息,如果想要显示图片信息,调用Toast的setView()方法。39进度条(ProgressBar)进度条(ProgressBar)是一种非常实用的组件,通常用于向用户显示某个耗时操作完成的进度。Android系统提供了两大类进度条样式,长形进度条(progessBarStyleHorizontal)和圆形进度条(progress-BarStyleLarge)。进度条的用处很多,比如,应用程序装载资源和网络连接时,可以提示用户稍等,这一类进度条只是代表应用程序某一部分程序的执行情况,而整个应用程序执行情况,则可以通过应用程序标题栏来显示一个进度条,可以调用Activity的requestWindowFeature()方法。40进度条(ProgressBar)风格Android支持几种风格的进度条,通过style属性指定风格,该属性支持以下几个属性值:@android:style/Widget.ProgressBar.Horizontal:水平进度条@android:style/Widget.ProgressBar.Inverse:不断跳跃、旋转画面的进度条@android:style/Widget.ProgressBar.Large:大进度条@android:style/Widget.ProgressBar.Large.Inverse:不断跳跃、旋转画面的大进度条@android:style/Widget.ProgressBar.small:小进度条@android:style/Widget.ProgressBar.small.Inverse:不断跳跃、旋转画面的小进度条41ProgressBar常用XML属性android:progressDrawable用于指定进度条的轨道的绘制形式,该属性可指定为一个LayerDrawable对象(该对象可通过在XML文件中用<layer-list>元素进行配置)的引用42ProgressBar实例实现进度条实例43拖动条(SeekBar)拖动条(SeekBar)通过滑块的位置来标识数值—而且拖动时允许用户拖动滑块来改变值,因此拖动条通常用于对系统的某种数值进行调节,比如音量调节等。SeekBar允许用户改变拖动条的滑块外观,改变滑块的外观通过如下属性来指定。android:thumb:指定一下Drawable对象,该对象将作为自定义滑块。为了让程序响应拖动条滑块位置的改变,程序可以考虑为它绑定一个OnSeekBarChangeListener监听器。44SeekBar实例通过拖动滑动块来改变图片的透明度45对话框(AlertDialog)对话框可以说是一个系统必不可少的内容,通常需要通过它来实现与用户的交互。Android能以多种方式创建对话框,但使用AlertDialog是最方便的。AlertDialog类的构造方法为protected方法,所以,为了创建AlertDialog对象,需要使用AlertDialog的一个内嵌类Builder类。创建好一个AlertDialog.Builder类,还需要用show方法来显示对话框。46AlertDialog常用方法47
创建AlertDialog流程创建AlertDialog.Builder对象,该对象是AlertDialog的创建器。调用AlertDialog.Builder的方法为对话框设置图标、标题、内容等。调用AlertDialog.Builder的create()方法创建AlertDialog对话框。调用AlertDialog的show()方法显示对话框。48AlertDialog实例显示提示消息的对话框使用AlertDialog创建单选列表对话框使用AlertDialog创建自定义登录对话框49ProgressDialog进度条ProgressDialog本身就代表了进度对话框,程序只要创建ProgressDialog实例,并将它显示出来就是一个进度对话框。当然,开发者也可以设置进度对话框里进度条的方法,ProgressDialog包含了如下常用方法:setIndeterminate(booleanindeterminate):设置对话框里的进度条不显示进度值。setMax(intmax):设置对话框里进度条的最大值。setMessage(C
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 联想销售精英面试技巧与策略
- 快消品行业运营经理的面试经验
- 基于电磁场的神经刺激技术实验研究报告
- 城市绿色出行规划及实施方案研究
- 中华财险广州中心支公司2026届春季招聘备考题库含完整答案详解【必刷】
- 2026贵州贵阳观山湖区铭廷小学语文教师招聘备考题库附参考答案详解(综合题)
- 2026江苏南京师范大学专业技术人员招聘10人备考题库(夺分金卷)附答案详解
- 2026广东省广晟控股集团有限公司总部中层岗位选聘7人备考题库含答案详解(精练)
- 2026年赞助类合同(1篇)
- 2026上海地铁维护保障有限公司车辆分公司应届高校毕业生招聘考试参考试题及答案解析
- 2025年脱硫石膏废弃物处理与资源化利用合同
- iCAP6000系列ICP初级操作
- 物业绿化养护计划与执行方案
- 2025年四川省高考化学试卷真题(含答案解析)
- 2025年广东省初中学业水平考试语文试卷(含答案详解)
- 2025年湖南省长沙市中考语文真题(解析版)
- 真空压力浸渍工艺-洞察及研究
- T/CAS 850-2024燃气用滚压螺纹热镀锌钢管技术规范
- 企业自行监测指南培训
- 2025中考英语作文复习:12个写作话题写作指导+满分范文
- 零基预算研究分析
评论
0/150
提交评论