本文还有配套的精品资源,点击获取
简介:在Android开发中实现仿iOS风格的Dialog,提供类似的用户体验。本文深入讲解了怎样创建一个具有圆角配景、淡入淡出动画、简洁内容区域和扁平化按钮样式的自定义Dialog,以及怎样通过属性设置、回调实现和展示方法来完成这一结果。开发者可利用相关代码和资源文件来学习怎样在Android应用中应用这种对话框,以加强应用界面的吸引力和交互性。
1. 仿IOS弹出Dialog结果的理论基础
在当今移动应用开发中,用户界面的美观性和易用性是吸引用户的关键因素之一。对话框(Dialog)作为与用户交互的紧张组件,其筹划和实现方式在差别的平台上有差别的尺度和要求。本文将深入探究仿造IOS风格的对话框结果,不但涉及基本理论知识,还会有具体的筹划、实现到优化的全过程。
首先,相识IOS风格对话框的基本特性是至关紧张的。它的界面通常简洁、直观,并且在视觉上具有高度的统一性。IOS的对话框不但需要满足功能需求,还必须在用户体验上做到优秀。它通常包括一个或多个按钮,用来响应用户的操作,并可能包含文本、图像等信息。
要创建一个类似IOS风格的对话框,需要思量其核心视觉结果,如圆角矩形配景、透明度渐变和动画结果。这些结果的实现需要开发者具备精良的前端技术和对Android UI框架的深入理解。此外,对话框的内容筹划和交互逻辑也是需要精心策划的,以确保用户可以无缝地与应用举行互动。
在接下来的章节中,我们将深入相识怎样在Android平台上筹划和实现一个具有IOS风格的对话框,包括定制布局、实现视觉结果、内容和交互筹划、以及交互反馈和事件处理。通过一系列的实践操作和代码示例,我们将构建一个功能完备、视觉上吸引人的对话框,从而提升应用的整体用户体验。
2. 自定义Dialog布局和筹划
2.1 筹划理念与思绪
2.1.1 界面简洁化的筹划原则
在Android应用开发中,自定义Dialog的目标是提供一种简洁、直观且与应用整体风格协调的交互方式。简洁化的筹划不但能够镌汰用户的认知负担,还能提升应用的可用性和美感。为了实现这一目标,我们遵循以下原则:
- 一致性 :自定义Dialog的风格需要和应用的主题保持一致,包括颜色、字体、按钮样式等元素。
- 最小化干扰 :只展示必要的信息,避免过多的装饰性元素,保持对话框的清楚与专注。
- 简明性 :文本描述应尽可能简洁明了,避免冗长复杂的句子。
- 清楚的条理感 :通过视觉元素(如阴影、圆角、配景色)来明确区分Dialog的差别部门,使得用户能够一目了然地识别紧张信息和操作按钮。
2.1.2 响应式筹划的思量
随着Android设备种类的增多,屏幕大小和分辨率变得多样化。为了保证自定义Dialog在各种设备上都能有精良的显示结果和交互体验,需要接纳响应式筹划策略:
- 布局灵活 :使用相对布局和权重系统而非固定尺寸,以适应差别屏幕。
- 动态调整组件 :根据屏幕大小动态调整文本、按钮的尺寸和布局,确保布局不会被压缩或拉伸失真。
- 媒介查询 :利用Android的资源限定符和布局适配器来为差别屏幕尺寸和分辨率提供专门的布局文件。
2.2 Dialog布局实现
2.2.1 XML布局文件的编写
在Android开发中,自定义Dialog的布局紧张通过XML文件来定义。以下是创建一个基本的Dialog布局的XML示例:
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="***"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:orientation="vertical"
- android:padding="16dp">
- <TextView
- android:id="@+id/dialogTitle"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="Dialog Title"
- android:textStyle="bold"
- android:textSize="18sp" />
- <TextView
- android:id="@+id/dialogMessage"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="This is a dialog message."
- android:textSize="16sp" />
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="horizontal"
- android:gravity="end"
- android:padding="8dp">
- <Button
- android:id="@+id/dialogNegativeBtn"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="Cancel" />
- <Button
- android:id="@+id/dialogPositiveBtn"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="OK"
- android:layout_marginStart="16dp" />
- </LinearLayout>
- </LinearLayout>
复制代码 在这个布局中,我们定义了一个垂直方向的线性布局作为根布局,内部包含两个文本视图用于显示标题和消息,以及一个程度方向的线性布局用于放置两个按钮。通过设置 android:layout_gravity="end" ,按钮会靠右对齐,符适用户对操作按钮位置的渴望。
2.2.2 使用布局参数控制组件位置
为了进一步准确控制组件在Dialog中的位置和大小,可以使用差别的布局参数,如 LinearLayout.LayoutParams 、 RelativeLayout.LayoutParams 或 ConstraintLayout.LayoutParams 等。以下是怎样在代码中为组件设置布局参数的示例:
- // 假设这是在创建Dialog的代码中
- Button positiveButton = findViewById(R.id.dialogPositiveBtn);
- // 设置按钮的布局参数
- RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(
- RelativeLayout.LayoutParams.WRAP_CONTENT,
- RelativeLayout.LayoutParams.WRAP_CONTENT);
- // 将按钮移动到Dialog的底部
- layoutParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
- // 应用布局参数
- positiveButton.setLayoutParams(layoutParams);
复制代码 在这个例子中,我们首先获取了Dialog中的按钮控件,然后创建了一个 RelativeLayout.LayoutParams 对象,并设置了组件的宽度和高度为包裹内容。接着,我们使用 addRule 方法将按钮对齐到RelativeLayout的底部。最后,通过 setLayoutParams 方法应用了这些布局参数到按钮上。
注意 :因为示例中使用的是LinearLayout,以是实际代码中应使用 LinearLayout.LayoutParams 代替 RelativeLayout.LayoutParams 。这里只是为了展示怎样使用布局参数。
通过调整组件的布局参数,我们可以实现更复杂的布局排列,满足各种筹划需求。
3. 实现Dialog核心视觉结果
3.1 实现圆角矩形配景
在当代移动应用界面筹划中,圆角矩形作为界面元素的配景可以提升整体视觉结果,使界面显得更加友爱且符合人机工程学。为了实现圆角矩形配景,开发者需要借助绘图API来完成。
3.1.1 选择符合的绘图API
在Android开发中,我们常用的API紧张是 Canvas 类,它提供了丰富的绘图功能,包括绘制圆角矩形。此外,我们也可以使用 ShapeDrawable 来实现圆角结果,这通常是通过定义一个shape资源文件来实现的。为了方便与自定义Dialog的其它部门集成,我们将使用 Canvas 类来绘制圆角矩形配景。
3.1.2 圆角矩形绘制技术实现
为了绘制圆角矩形,我们需要定义矩形的宽度、高度、边角半径,然后在 onDraw 方法中使用 Canvas 类的 drawRoundRect 方法举行绘制。以下是一个简单的示例代码:
- @Override
- protected void onDraw(Canvas canvas) {
- super.onDraw(canvas);
- // 设置圆角矩形的参数
- int width = getWidth();
- int height = getHeight();
- float radius = resources.getDimension(R.dimen.rounded_corner_radius);
- // 创建一个圆角矩形对象
- RectF rectF = new RectF(0, 0, width, height);
- // 使用圆角矩形对象和圆角半径绘制
- Paint paint = new Paint();
- paint.setColor(Color.WHITE); // 设置背景颜色
- paint.setAntiAlias(true); // 抗锯齿处理,使圆角更加平滑
- canvas.drawRoundRect(rectF, radius, radius, paint);
- }
复制代码 在这段代码中,我们首先获取Dialog的宽度和高度,并定义圆角的半径。接着,我们使用 RectF 创建一个矩形对象,并利用 Canvas 类的 drawRoundRect 方法绘制圆角矩形。 Paint 对象用于设置绘制的样式,如颜色和抗锯齿处理。通过这种方式,我们可以轻松实现圆角矩形配景的视觉结果。
3.2 创建淡入淡出动画结果
动画结果为用户界面增添了更多的动态感,使用户在使用应用时感觉更加流畅和天然。淡入淡出动画是两种常见的UI过渡结果,它们可以给Dialog带来更天然的出现和消散过程。
3.2.1 动画XML文件的创建和引用
在Android中,创建动画结果通常涉及到在XML文件中定义动画属性。首先,我们需要创建两个动画资源文件,一个用于淡入结果,另一个用于淡出结果。它们将被定义在res/anim目录下。
淡入动画 fade_in.xml 示例:
- <alpha xmlns:android="***"
- android:fromAlpha="0.0"
- android:toAlpha="1.0"
- android:duration="300">
- </alpha>
复制代码 淡出动画 fade_out.xml 示例:
- <alpha xmlns:android="***"
- android:fromAlpha="1.0"
- android:toAlpha="0.0"
- android:duration="300"
- android:startOffset="500">
- </alpha>
复制代码 上述XML文件定义了淡入和淡出结果, fromAlpha 和 toAlpha 分别代表动画开始和结束时的透明度。 duration 定义了动画连续的时间,而 startOffset 表现淡出结果需要在淡入结果之后多长时间开始。
3.2.2 动画参数的配置和优化
动画结果的关键在于符合的参数配置,包括连续时间、耽误、重复次数和插值器类型等。对于Dialog的淡入淡出动画,我们通常渴望它们是平滑的过渡结果。
- // 设置淡入动画
- dialogView.startAnimation(AnimationUtils.loadAnimation(context, R.anim.fade_in));
- // 设置淡出动画
- dialogView.startAnimation(AnimationUtils.loadAnimation(context, R.anim.fade_out));
复制代码 在代码中,我们首先调用 startAnimation 方法,并传入通过 AnimationUtils.loadAnimation 方法加载的动画对象。此处, context 指代当前应用的上下文, R.anim.fade_in 和 R.anim.fade_out 是我们先前定义的淡入和淡出动画资源。
对动画参数的优化紧张是在实际设备上多次测试,确保动画在差别设备上的表现一致,且视觉结果符合预期。在动画结束时,我们可能需要执行一些额外的操作,比如隐藏Dialog或者结束当前活动,这通常在 AnimationListener 中举行处理。
- animation.setAnimationListener(new Animation.AnimationListener() {
- @Override
- public void onAnimationStart(Animation animation) {
- }
- @Override
- public void onAnimationEnd(Animation animation) {
- dialog.dismiss();
- }
- @Override
- public void onAnimationRepeat(Animation animation) {
- }
- });
复制代码 在这里, onAnimationEnd 方法被用来执行当动画结束后需要举行的操作。在这个例子中,我们使用 dialog.dismiss() 来隐藏Dialog。
至此,我们已详细介绍了实现Dialog核心视觉结果的圆角矩形配景和淡入淡出动画的具体技术实现和参数配置。通过这些步骤,我们能够创建出既美观又流畅的用户界面元素。
4. 对话框内容与交互筹划
在上一章节中,我们已经深入探究了怎样实现一个仿IOS风格的Dialog的核心视觉结果,包括圆角矩形的配景筹划以及淡入淡出的动画结果。接下来,我们将眼光转向对话框内容与交互筹划的维度,深入解析怎样通过精心筹划的内容区域和扁平化的按钮样式来提升用户体验。
4.1 筹划简洁内容区域
4.1.1 笔墨和图标的选择与布局
为了保证对话框内容区域的简洁性,我们需要在笔墨和图标的选择与布局上下功夫。首先,我们要确保所用字体清楚易读,避免使用过于花哨的字体样式。一般而言,对于英文可以接纳Roboto或者Helvetica如许的无衬线字体,对于中文,保举使用苹方(PingFang SC)等清楚的等线体字体。
图标的选择需要与界面风格保持一致,通常使用线性图标(Line Icon)或扁平化图标(Flat Icon),以到达简洁的视觉结果。图标尺寸不宜过大或过小,通常情况下,图标的最佳尺寸为24x24到48x48像素之间。在布局上,应保持足够的间距,避免内容拥挤,造成用户阅读困扰。
4.1.2 内容区域的交互逻辑
内容区域的交互逻辑是提升用户体验的关键。筹划时,要思量内容的呈现方式和用户可能的交互举动。比如,对话框中的提示信息应该精简、直接,避免冗长的文本。若需要提供多个选项,应该按照逻辑次序排列,以清楚的标题和简洁的描述举行阐明。
此外,对于有输入需求的对话框,如输入框、下拉菜单等,要确保输入项的标签与输入框靠得很近,以镌汰用户的视线移动距离,提高输入服从。在多步骤表单中,可以通过箭头或分隔线来引导用户的视觉流程,使步骤间的切换变得更加流畅。
4.2 应用扁平化按钮样式
4.2.1 扁平化筹划理念的表现
扁平化筹划理念的引入旨在消除多余的装饰,例如立体感、渐变、阴影等,从而让界面显得更加干净、当代。在对话框的按钮筹划中,扁平化通常表现为简单直观的色彩搭配、清楚的边缘和统一的形状筹划。为了确保按钮的视觉吸引力,通常会接纳对比光显的色彩或图标来突出按钮的可点击性。
4.2.2 样式定制与实现
在实现扁平化按钮样式时,可以通过定义Android中的 Button 或 TextView 来创建自定义按钮,并设置相应的配景和文本属性。例如,可以创建一个XML文件来定义按钮的配景样式:
- <!-- button_background.xml -->
- <selector xmlns:android="***">
- <item android:state_pressed="true" android:drawable="@drawable/button_pressed" />
- <item android:state_enabled="true" android:drawable="@drawable/button_normal" />
- <item android:drawable="@drawable/button_disabled" />
- </selector>
复制代码 在上述代码中,定义了按钮在差别状态下的配景样式,包括按压状态、启用状态和禁用状态。 @drawable/button_pressed 、 @drawable/button_normal 和 @drawable/button_disabled 是对应状态下的图像资源。
然后,在对话框布局文件中引用这个配景样式:
- <Button
- android:id="@+id/dialog_positive_button"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@string/positive_button_label"
- android:background="@drawable/button_background" />
复制代码 通过上述方式,我们可以创建符合扁平化筹划理念的自定义按钮,并通过代码逻辑处理按钮的点击事件,实现相应的功能。
接下来,我们将继续深入第五章,详细介绍对话框的交互反馈与事件处理逻辑。
5. 交互反馈与事件处理
随着用户体验筹划的不停发展,对话框作为用户与应用交互的媒介,其反馈机制和事件处理逻辑变得越发紧张。一个精良的用户反馈机制能够加强用户的满意度和操作的惬意感,而灵活的事件处理逻辑则能够帮助开发者更好地控制对话框的举动。本章将详细探究按钮点击事件的监听机制、交互反馈的实现方式以及事件回调的编写和数据处理。
5.1 监听按钮点击的交互反馈
在筹划对话框时,按钮是实现用户交互的紧张元素之一。为了提升用户体验,按钮的点击不但需要触发相应的事件,还应当提供及时的视觉或听觉反馈给用户。这涉及到对按钮点击事件的监听机制以及怎样集成反馈动画与声音。
5.1.1 按钮点击事件监听机制
在Android开发中,按钮的点击事件通常通过设置监听器(OnClickListener)来处理。当按钮被点击时,会触发监听器中的onClick()方法。以下是一个简单的监听器设置的代码示例:
- Button myButton = findViewById(R.id.my_button);
- myButton.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- // 事件处理逻辑
- Toast.makeText(getApplicationContext(), "Button Clicked", Toast.LENGTH_SHORT).show();
- }
- });
复制代码 在这段代码中,首先通过findViewById方法获取到界面上的按钮实例,然后通过setOnClickListener方法设置一个监听器。当按钮被点击时,onClick()方法会被调用,在这个方法中可以添加需要执行的操作,例如显示一个Toast提示信息。
5.1.2 反馈动画与声音的集成
为了给用户更丰富的交互体验,除了在界面上显示提示信息外,还可以通过动画或声音来强化反馈。对于动画,可以使用Android的动画框架来实现。例如,以下是一个简单的淡入淡出动画实现:
- <!-- res/anim/fade_in_out.xml -->
- <set xmlns:android="***">
- <alpha android:fromAlpha="0.0" android:toAlpha="1.0" android:duration="300" />
- <alpha android:fromAlpha="1.0" android:toAlpha="0.0" android:startOffset="300" android:duration="300" />
- </set>
复制代码 在按钮的点击事件中,可以通过调用AnimationUtils加载并启动这个动画:
- Animation fadeAnimation = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.fade_in_out);
- myButton.startAnimation(fadeAnimation);
复制代码 对于声音反馈,可以在Android资源文件中准备一个音频文件,并在点击事件中通过MediaPlayer类播放这个声音:
- MediaPlayer mediaPlayer = MediaPlayer.create(getApplicationContext(), R.raw.click_sound);
- mediaPlayer.start();
复制代码 上述代码段创建了一个MediaPlayer对象,并指定音频资源。调用start()方法即可播放声音。
5.2 按钮点击事件回调实现
在复杂的业务逻辑中,按钮点击事件的处理可能需要从监听器回调到更深条理的业务逻辑中。这通常涉及到筹划回调函数并处理相关的数据。
5.2.1 回调函数的筹划与编写
回调函数是将一个函数作为参数传递给另一个函数的方法,用于在适当的时候调用。在Android开发中,可以将接口作为回调函数的载体。例如,以下是一个接口的筹划和使用:
- public interface ButtonClickCallback {
- void onButtonClick();
- }
- public class MyActivity extends AppCompatActivity implements ButtonClickCallback {
- @Override
- public void onButtonClick() {
- // 处理点击事件后的逻辑
- }
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_my);
- Button myButton = findViewById(R.id.my_button);
- myButton.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- onButtonClick(); // 回调实现
- }
- });
- }
- }
复制代码 在这个例子中,定义了一个ButtonClickCallback接口,并在MyActivity中实现了这个接口。在Activity的onCreate方法中设置了按钮的点击监听器,并在点击事件发生时调用了回调方法onButtonClick()。
5.2.2 参数传递与数据处理
在实际的应用中,点击事件可能需要传递更多的上下文信息。为此,可以在回调函数中增长参数,或者在事件处理逻辑中传递额外的数据。例如,以下是怎样将按钮ID作为参数传递给回调函数:
- public class MyActivity extends AppCompatActivity implements ButtonClickCallback {
- @Override
- public void onButtonClick(int buttonId) {
- // 根据不同的按钮ID处理不同的逻辑
- }
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_my);
- Button myButton = findViewById(R.id.my_button);
- myButton.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- onButtonClick(myButton.getId()); // 传递按钮ID作为参数
- }
- });
- }
- }
复制代码 在这个改进的例子中,onButtonClick方法担当一个int类型的参数,表现被点击按钮的ID。在点击监听器中,通过调用按钮的getId()方法获取按钮ID,并将其传递给回调函数。
通过以上方法,按钮点击事件可以实现复杂的交互逻辑,同时保证了代码的可读性和可维护性。通过精心筹划的回调机制和事件处理逻辑,可以将应用的业务需求更好地落实到用户体验上。
6. Dialog综合应用与优化
6.1 对话框属性设置方法
对话框的属性设置是其表现的核心部门。通过适当配置属性,可以对Dialog的视觉结果举行准确控制。
6.1.1 属性定义与管理
每个Dialog组件都有一系列可配置的属性,包括但不限于配景色、宽度、高度、动画结果等。例如,在Android中, Dialog 类的 window 属性允许我们访问底层窗口的一些特性。
- dialog.getWindow().setBackgroundDrawableResource(R.drawable.rounded_corners);
复制代码 上述代码中的 setBackgroundDrawableResource 方法,它允许我们为Dialog设置自定义的配景,这在创建圆角矩形对话框时尤其有用。
6.1.2 属性对视觉结果的影响
对话框的每一个属性都可能对最终的视觉结果产生显著影响。例如,修改Dialog的宽度属性,可以在差别屏幕尺寸上提供更好的用户体验。
- dialog.getWindow().setLayout(WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.WRAP_CONTENT);
复制代码 通过将宽度设置为 MATCH_PARENT ,Dialog将扩展至其父容器的宽度,从而适应大屏幕设备。
6.2 展示Dialog的具体步骤
6.2.1 完备的展示流程
展示Dialog涉及到多个步骤,从创建Dialog实例到显示它,每一步都至关紧张。
- // 创建Dialog实例final Dialog dialog = new Dialog(context);// 设置自定义布局dialog.setContentView(R.layout.custom_dialog_layout);// 设置Dialog属性dialog.getWindow().setBackgroundDrawableResource(R.drawable.rounded_corners);
- dialog.getWindow().setLayout(WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.WRAP_CONTENT);
- // 显示Dialogdialog.show();
复制代码 在这个简单的例子中,我们创建了一个Dialog,设置了自定义的布局以及配景,并最终显示了Dialog。
6.2.2 实际场景中的应用案例分析
在实际应用中,我们可能需要根据上下文动态创建和配置Dialog。思量一个用户需要在表单提交前确认是否继续的情况,我们可以如许做:
- final Dialog confirmDialog = new Dialog(context);
- confirmDialog.setContentView(R.layout.confirm_dialog_layout);
- confirmDialog.getWindow().setBackgroundDrawableResource(R.drawable.rounded_corners);
- confirmDialog.getWindow().setLayout(WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.WRAP_CONTENT);
- // 设置按钮点击事件
- Button confirmButton = confirmDialog.findViewById(R.id.confirm);
- confirmButton.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View view) {
- // 执行确认操作
- }
- });
- Button cancelButton = confirmDialog.findViewById(R.id.cancel);
- cancelButton.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View view) {
- // 执行取消操作
- confirmDialog.dismiss();
- }
- });
- confirmDialog.show();
复制代码 6.2.3 常见问题的解决方法
当对话框需要适应差别屏幕尺寸或分辨率时,可能会出现布局错位的问题。一个常见的解决方案是使用尺寸限定符(如 dimens.xml )来定义差别屏幕尺寸下使用的尺寸值。
- <!-- res/values/dimens.xml -->
- <resources>
- <dimen name="dialog_margin">16dp</dimen>
- </resources>
- <!-- res/values-land/dimens.xml -->
- <resources>
- <dimen name="dialog_margin">24dp</dimen>
- </resources>
复制代码 通过为特定的方向和屏幕尺寸定义差别的尺寸值,我们可以优化Dialog的显示结果,确保其在全部设备上都具有一致的用户体验。
在实现和优化对话框的过程中,开发者需要不停地测试和调整属性设置以满足差别用户和设备的需求。通过这种方法,开发者可以确保对话框不但功能美满,而且表面和用户体验俱佳。
本文还有配套的精品资源,点击获取
简介:在Android开发中实现仿iOS风格的Dialog,提供类似的用户体验。本文深入讲解了怎样创建一个具有圆角配景、淡入淡出动画、简洁内容区域和扁平化按钮样式的自定义Dialog,以及怎样通过属性设置、回调实现和展示方法来完成这一结果。开发者可利用相关代码和资源文件来学习怎样在Android应用中应用这种对话框,以加强应用界面的吸引力和交互性。
本文还有配套的精品资源,点击获取
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |