android expandablelistview横向,expandableListView 总结

article/2025/9/26 14:42:51

实现效果图:

52dc348ef41efa8e9e10fca2c60dbfd9.png

expandableListView  groupIndicator 图片默认是在左边,而且比较难看,而我要的是实现groupIndicator 在右边自定义图片,

换图片

最简单的就是直接copy 系统

@android:drawable/expander_group

?android:attr/expandableListPreferredItemIndicatorLeft

?android:attr/expandableListPreferredItemIndicatorRight

@android:drawable/divider_horizontal_dark_opaque

看到这个没有

@android:drawable/expander_group

我们只要把这个给换了,那 groupIndicator也就跟着变了。但是改这个有个问题显示出来的

显示的效果不是很好,图片有被拉升过,系统自己是做了个.9图片。我们已可以

2.做一张.9图片

在你eclipse 的解压目录下,找到\sdk\tools\

我的是D:\android-IDE-eclipse-64\adt-bundle-windows-x86-20130522\sdk\tools

在这个目录下有一个draw9patch.bat的批处理文件。我们要用它做.9图,双击直接打开。直接将你要做成.9 的原图直接拉进工具。

3.创建 Indicator selector expander_group.xml 文件

android:state_expanded="true"

android:drawable="@drawable/up" />

android:drawable="@drawable/down" />

4.放一张图片到你的res目录下这里我直接用系统的

@android:drawable/divider_horizontal_dark_opaque

这个是一张图片

5.在自己的style。xml里写一个

@drawable/expander_group

?android:attr/expandableListPreferredItemIndicatorLeft

?android:attr/expandableListPreferredItemIndicatorRight

@drawable/divider_horizontal_dark_opaque

这样我们就自己定义好了expandable的style

6.加载自己的style

android:id="@+id/expandableListView1"

style="@style/ExpandableListView"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:layout_alignParentLeft="true"

android:layout_alignParentTop="true" >

7.在activity中设置 Indicator位置

expandablelistView 提供一个方法设置位置

Display dp = getWindowManager().getDefaultDisplay();

int width = dp.getWidth();

lv.setIndicatorBounds(width-50, width);

运行完结果:

dc65fd5a901fbff3faff79b26b855efd.png

不知道什么原因还是有点拉伸,效果不是很好,但又要实现title图片不回被拉伸放大这样的效果;所以我就只能把图标给屏蔽了,然后在groupItem的布局加一个ImageView,用ImageView自己实现。

android:id="@+id/exlv_select_binddev"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:groupIndicator="@null"

android:childIndicator="@null"

>

这样就把他自带的图标给屏蔽了,然后直接在groupitem布局加上一个ImageView,再做一个Childitem的布局,布局我直接设4个button,自由发挥了。

然后在适配器上getgroupView 设置父布局,在getChildView设置子布局。和listView的差不多。

现在要做的就是设置监听

监听ImageView expandableListView 的点击事件,这里我是点图片展开和关闭Child,长点击expandableListView 也展开和关闭Child,点击进入另一个界面。

监听ImageView的点击事件,这里关键是保存position。直接写一个内部类保存position

class ImageListener implements OnClickListener {

private int groupPosition;

public ImageListener(int groupPosition)

{

this.groupPosition = groupPosition;

}

@Override

public void onClick( View v )

{

Toast.makeText(ExpandableActivity.this, " p_w_picpath groupPosition : " + groupPosition, Toast.LENGTH_SHORT)

.show();

if (mlist.isGroupExpanded(groupPosition))//是否展开

{

mlist.collapseGroup(groupPosition);//设置关闭

}

else

{

mlist.expandGroup(groupPosition);//设置展开

}

}

}

监听长点击事件

mlist.setOnItemLongClickListener(new OnItemLongClickListener() {

public boolean onItemLongClick( AdapterView> parent, View childView, int flatPos, long id )

{

if (ExpandableListView.getPackedPositionType(id) == ExpandableListView.PACKED_POSITION_TYPE_GROUP)

{

long position = ((ExpandableListView) parent).getExpandableListPosition(flatPos);

int groupPosition = ExpandableListView.getPackedPositionGroup(position);

int childPosition = ExpandableListView.getPackedPositionChild(position);

System.out.println(groupPosition + childPosition + " :groupPosition childPosition" + flatPos + " "

+ id);

if (mlist.isGroupExpanded(groupPosition))

{

mlist.collapseGroup(groupPosition);

}

else

{

mlist.expandGroup(groupPosition);

}

return true;

}

else if (ExpandableListView.getPackedPositionType(id) == ExpandableListView.PACKED_POSITION_TYPE_CHILD)

{

long position = ((ExpandableListView) parent).getExpandableListPosition(flatPos);

int groupPosition = ExpandableListView.getPackedPositionGroup(position);

int childPosition = ExpandableListView.getPackedPositionChild(position);

System.out.println(childPosition + " :groupPosition");

return true;

}

return false;

}

});

获取点击事件

mlist.setOnGroupClickListener(new OnGroupClickListener() {

@Override

public boolean onGroupClick( ExpandableListView parent, View v, final int groupPosition, long id )

{

Toast.makeText(ExpandableActivity.this, " click groupPosition : " + groupPosition + " id : " + id,

Toast.LENGTH_SHORT).show();

return true;

}

});

这样就可以了

Child 的点击事件那就比较简单了,直接和ImageView的点击事件一样处理,或者直接写死了,Child是横向的,也只有4个不多。

ch.tv_choose.setOnClickListener(new OnClickListener() {

@Override

public void onClick( View v )

{

// TODO 子控件进入

onChildChick(0, FatherItem);

}

});

public void onChildChick( int childItemid, int fatherItemid )

{

// TODO 接收child

Toast.makeText(this, "  childItemid : " + childItemid + " fatherItemid : " + fatherItemid, Toast.LENGTH_SHORT)

.show();

}

这样就搞定了

代码:package com.example.listviewanditemchick;

import java.util.List;

import android.os.Bundle;

import android.app.Activity;

import android.content.Context;

import android.database.DataSetObserver;

import android.graphics.drawable.Drawable;

import android.support.v4.widget.SearchViewCompat.OnCloseListenerCompat;

import android.view.Display;

import android.view.LayoutInflater;

import android.view.Menu;

import android.view.View;

import android.view.ViewGroup;

import android.view.View.OnClickListener;

import android.widget.AdapterView;

import android.widget.BaseExpandableListAdapter;

import android.widget.ExpandableListAdapter;

import android.widget.ExpandableListView;

import android.widget.ImageButton;

import android.widget.ImageView;

import android.widget.ListAdapter;

import android.widget.TextView;

import android.widget.Toast;

import android.widget.AdapterView.OnItemLongClickListener;

import android.widget.ExpandableListView.OnGroupClickListener;

import android.widget.ExpandableListView.OnGroupExpandListener;

public class ExpandableActivity extends Activity {

private ExpandableListView mlist;

private MyExpandableadapter madapter;

@Override

protected void onCreate( Bundle savedInstanceState )

{

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_expandable);

mlist = (ExpandableListView) findViewById(R.id.expandableListView1);

madapter = new MyExpandableadapter(this);

mlist.setAdapter(madapter);

Display dp = getWindowManager().getDefaultDisplay();

int width = dp.getWidth();

mlist.setIndicatorBounds(width - 50, width);

onClickExpandable();

}

private void onClickExpandable()

{

mlist.setOnGroupClickListener(new OnGroupClickListener() {

@Override

public boolean onGroupClick( ExpandableListView parent, View v, final int groupPosition, long id )

{

Toast.makeText(ExpandableActivity.this, " click groupPosition : " + groupPosition + " id : " + id,

Toast.LENGTH_SHORT).show();

return true;

}

});

//

mlist.setOnItemLongClickListener(new OnItemLongClickListener() {

public boolean onItemLongClick( AdapterView> parent, View childView, int flatPos, long id )

{

if (ExpandableListView.getPackedPositionType(id) == ExpandableListView.PACKED_POSITION_TYPE_GROUP)

{

long position = ((ExpandableListView) parent).getExpandableListPosition(flatPos);

int groupPosition = ExpandableListView.getPackedPositionGroup(position);

int childPosition = ExpandableListView.getPackedPositionChild(position);

System.out.println(groupPosition + childPosition + " :groupPosition childPosition" + flatPos + " "

+ id);

if (mlist.isGroupExpanded(groupPosition))

{

mlist.collapseGroup(groupPosition);

}

else

{

mlist.expandGroup(groupPosition);

}

return true;

}

else if (ExpandableListView.getPackedPositionType(id) == ExpandableListView.PACKED_POSITION_TYPE_CHILD)

{

long position = ((ExpandableListView) parent).getExpandableListPosition(flatPos);

int groupPosition = ExpandableListView.getPackedPositionGroup(position);

int childPosition = ExpandableListView.getPackedPositionChild(position);

System.out.println(childPosition + " :groupPosition");

return true;

}

return false;

}

});

// 子菜单打开一个其他的就关闭

mlist.setOnGroupExpandListener(new OnGroupExpandListener() {

@Override

public void onGroupExpand( int groupPosition )

{

for (int i = 0; i < madapter.getGroupCount(); i++)

{

if (groupPosition != i)

{

mlist.collapseGroup(i);

}

}

}

});

}

public void onChildChick( int childItemid, int fatherItemid )

{

// TODO 接收child

Toast.makeText(this, " childItemid : " + childItemid + " fatherItemid : " + fatherItemid, Toast.LENGTH_SHORT)

.show();

}

public void onImageChick( int groupPosition )

{

Toast.makeText(ExpandableActivity.this, " p_w_picpath groupPosition : " + groupPosition, Toast.LENGTH_SHORT).show();

// if(isExpanded) p_w_picpath.setImageResource(R.drawable.up);

// else p_w_picpath.setImageResource(R.drawable.down);

if (mlist.isGroupExpanded(groupPosition))

{

mlist.collapseGroup(groupPosition);

}

else

{

mlist.expandGroup(groupPosition);

}

}

class ImageListener implements OnClickListener {

private int groupPosition;

public ImageListener(int groupPosition)

{

this.groupPosition = groupPosition;

}

@Override

public void onClick( View v )

{

Toast.makeText(ExpandableActivity.this, " p_w_picpath groupPosition : " + groupPosition, Toast.LENGTH_SHORT)

.show();

if (mlist.isGroupExpanded(groupPosition))

{

mlist.collapseGroup(groupPosition);

}

else

{

mlist.expandGroup(groupPosition);

}

}

}

class MyExpandableadapter extends BaseExpandableListAdapter {

private Context context;

private int Imageposition;

private boolean expanded;

private int FatherItem;

public MyExpandableadapter(Context c)

{

this.context = c;

}

@Override

public int getGroupCount()

{

return 10;

}

@Override

public int getChildrenCount( int groupPosition )

{

return 1;

}

@Override

public Object getGroup( int groupPosition )

{

return null;

}

@Override

public Object getChild( int groupPosition, int childPosition )

{

return null;

}

@Override

public long getGroupId( int groupPosition )

{

return groupPosition;

}

@Override

public long getChildId( int groupPosition, int childPosition )

{

return childPosition;

}

@Override

public boolean hasStableIds()

{

return false;

}

public void setTitleImage( boolean isexpandeb )

{

}

@Override

public View getGroupView( int groupPosition, boolean isExpanded, View convertView, ViewGroup parent )

{

Imageposition = groupPosition;

groupHowd gh;

if (convertView == null)

{

gh = new groupHowd();

// convertView =

// LayoutInflater.from(context).inflate(R.layout.item, null);

convertView = LayoutInflater.from(context).inflate(R.layout.item_p_w_picpathbutton, null);

gh.p_w_picpath = (ImageView) convertView.findViewById(R.id.p_w_picpathButton1);

convertView.setTag(gh);

}

else

{

gh = (groupHowd) convertView.getTag();

}

expanded = isExpanded;

if (isExpanded)

gh.p_w_picpath.setImageResource(R.drawable.up);

else gh.p_w_picpath.setImageResource(R.drawable.down);

gh.p_w_picpath.setOnClickListener(new ImageListener(Imageposition));

return convertView;

}

@Override

public View getChildView( int groupPosition, int childPosition, boolean isLastChild, View convertView,

ViewGroup parent )

{

FatherItem = groupPosition;

childHowd ch;

if (convertView == null)

{

ch = new childHowd();

convertView = LayoutInflater.from(context).inflate(R.layout.selecte_exlv_item, null);

ch.tv_choose = (TextView) convertView.findViewById(R.id.tv_choose);

ch.tv_select = (TextView) convertView.findViewById(R.id.tv_select);

ch.tv_up = (TextView) convertView.findViewById(R.id.tv_up);

ch.tv_delete = (TextView) convertView.findViewById(R.id.tv_delete);

convertView.setTag(ch);

}

else

{

ch = (childHowd) convertView.getTag();

}

ch.tv_choose.setText("进入");

ch.tv_select.setText("查看");

ch.tv_up.setText("修改");

ch.tv_delete.setText("删除");

ch.tv_choose.setOnClickListener(new OnClickListener() {

@Override

public void onClick( View v )

{

// TODO 子控件进入

onChildChick(0, FatherItem);

}

});

ch.tv_select.setOnClickListener(new OnClickListener() {

@Override

public void onClick( View v )

{

// TODO 子控键查看

onChildChick(1, FatherItem);

}

});

ch.tv_up.setOnClickListener(new OnClickListener() {

@Override

public void onClick( View v )

{

// TODO 子控件更新

onChildChick(2, FatherItem);

}

});

ch.tv_delete.setOnClickListener(new OnClickListener() {

@Override

public void onClick( View v )

{

// TODO 子控件你删除

onChildChick(3, FatherItem);

}

});

return convertView;

}

@Override

public boolean isChildSelectable( int groupPosition, int childPosition )

{

// TODO Auto-generated method stub

return true;

}

class groupHowd {

ImageView p_w_picpath;

TextView tv_name;

TextView tv_id;

TextView tv_state;

}

class childHowd {

TextView tv_choose;

TextView tv_select;

TextView tv_up;

TextView tv_delete;

}

}

}

groupView 布局:这里最好用relativeLayout,之前用linearlayout不能实现点击p_w_picpathView没反应回去不到事件,后面监听触摸事件,那做法更麻烦,后来改用relativelayout后就可以了。

然后设置 RelativeLayout 设置android:descendantFocusability="blocksDescendants"

要获取点击事件的 ImageView设置 android:focusable="false"就行了;<?xml version="1.0" encoding="utf-8"?>

android:id="@+id/LinearLayout1"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:descendantFocusability="blocksDescendants"

android:padding="8dp" >

android:id="@+id/p_w_picpathView1"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:src="@drawable/ic_launcher" />

android:id="@+id/textView1"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_alignTop="@+id/p_w_picpathView1"

android:layout_marginLeft="14dp"

android:layout_toRightOf="@+id/p_w_picpathView1"

android:text="Large Text"

android:textAppearance="?android:attr/textAppearanceLarge" />

android:id="@+id/textView2"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_alignBottom="@+id/p_w_picpathView1"

android:layout_alignLeft="@+id/textView1"

android:text="TextView" />

android:id="@+id/p_w_picpathButton1"

android:scaleType="fitXY"

android:layout_width="45dp"

android:layout_height="45dp"

android:layout_alignBottom="@+id/textView2"

android:layout_alignParentRight="true"

android:src="@drawable/down"

android:focusable="false" />

Child布局:<?xml version="1.0" encoding="utf-8"?>

android:layout_width="match_parent"

android:layout_height="match_parent"

android:descendantFocusability="beforeDescendants"

android:orientation="horizontal" >

android:id="@+id/tv_choose"

android:layout_width="wrap_content"

android:layout_height="@dimen/p_w_picpath_height"

android:layout_weight="1"

android:background="@drawable/btn_selector_blue"

android:clickable="true"

android:enabled="true"

android:focusable="true"

android:gravity="center"

android:padding="4dp"

android:text="进入"

android:textColor="@color/white"

android:textSize="@dimen/fontxiao" />

android:id="@+id/p_w_picpathView1"

android:layout_width="2dp"

android:layout_height="@dimen/p_w_picpath_height"

android:background="@color/black" />

android:id="@+id/tv_select"

android:layout_width="wrap_content"

android:layout_height="@dimen/p_w_picpath_height"

android:layout_weight="1"

android:background="@drawable/btn_selector_blue"

android:clickable="true"

android:enabled="true"

android:focusable="true"

android:gravity="center"

android:padding="4dp"

android:text="查看"

android:textColor="@color/white"

android:textSize="@dimen/fontxiao" />

android:id="@+id/p_w_picpathView1"

android:layout_width="2dp"

android:layout_height="@dimen/p_w_picpath_height"

android:background="@color/black"/>

android:id="@+id/tv_up"

android:layout_width="wrap_content"

android:layout_height="@dimen/p_w_picpath_height"

android:layout_weight="0.96"

android:background="@drawable/btn_selector_blue"

android:clickable="true"

android:enabled="true"

android:focusable="true"

android:gravity="center"

android:padding="4dp"

android:text="修改"

android:textColor="@color/white"

android:textSize="@dimen/fontxiao" />

android:id="@+id/p_w_picpathView1"

android:layout_width="2dp"

android:layout_height="@dimen/p_w_picpath_height"

android:background="@color/black"/>

android:id="@+id/tv_delete"

android:layout_width="wrap_content"

android:layout_height="@dimen/p_w_picpath_height"

android:layout_weight="1"

android:background="@drawable/btn_selector_blue"

android:clickable="true"

android:enabled="true"

android:focusable="true"

android:gravity="center"

android:padding="4dp"

android:text="删除"

android:textColor="@color/white"

android:textSize="@dimen/fontxiao" />


http://chatgpt.dhexx.cn/article/AQ2ONos7.shtml

相关文章

Android学习之ExpandableListView

什么是ExpandableListView ExpandableListView是扩展的ListView&#xff0c;继承自ListView&#xff1b;ExpandableListView可以实现点击展开列表&#xff0c;再点击收缩回去的效果。 ExpandableListView的使用 首先需要在主布局文件中声明ExpandableListView&#xff1b; …

ExpandableListView详解

文章目录 效果图ExpandableListView的简介与使用去掉ExpandableListView的箭头以及自定义Indicator解决setOnChildClickListener失效问题解决collapseGroup(i)崩溃问题解决group_item.xml中包含CheckBox、EditText等&#xff0c;点击不能展开的问题 1.效果图 2.ExpandableLi…

values_list()

转载&#xff1a;https://www.cnblogs.com/chenchao1990/p/5311531.html?utm_sourcetuicool&utm_mediumreferral

列表(lists)

Lists and the things you can do with them.Includes indexing(索引&#xff09;,slicing &#xff08;切片&#xff09;and mutating&#xff08;变异&#xff09;. 1.Python 中的列表表示有序的值序列。 以下是如何创建它们的示例&#xff1a; primes [2,3,5,7] #我们可以…

Android Preference API 用法--ListPreference(一)

一&#xff0e;ListPreference简介 我们都只知道SharedPreference非常适合于参数设置功能&#xff0c;在此处的preference 也是代表SharedPreference的意思&#xff0c;在SharedPreference中&#xff0c;我们可以迅速的将某些值保存进xml文件中&#xff0c;然后我们可以读取这…

android entries属性,ListPreference需要设置两个属性:android:entries和android:entryValues...

android:defaultValue"black" android:entries"array/setting_skintheme" android:entryValues"array/setting_skintheme_value" android:key"SkinTheme" android:summary"请选择您喜欢的软件皮肤颜色" android:title"…

Android ListPreference的用法

首先&#xff0c;我们明确&#xff0c;preference是和数据存储相关的。 其次&#xff0c;它能帮助我们方便的进行数据存储&#xff01;为什么这个地方一定要强调下方便的这个词呢&#xff1f;原因是&#xff0c;我们可以根本就不使用&#xff0c;我们有另外的N种办法可以实现同…

List总结

ArrayList与LinkedList的区别是什么&#xff1f; 从继承树&#xff0c;底层数据结构&#xff0c;线程安全&#xff0c;执行效率来进行分析。 1.底层使用的数据结构 ArrayList 底层使用的是Object数组&#xff0c;初始化时就会指向的会是一个static修饰的空数组&#xff0c;数…

android Preference ListPreference EditTextPreference

android中包含Preference ListPreference EditTextPreference等控件布局的写法&#xff0c;已经操作各个控件的事件介绍&#xff0c;如下 <?xml version"1.0" encoding"utf-8"?> <PreferenceScreen xmlns:android"http://schemas.android…

Android中ListPreference的使用

这篇主要是具体例子&#xff0c;可以先看一下理论&#xff0c;网址是&#xff1a;Android中Preference的使用以及监听事件分析 我们可以先看一下效果图 我们先截取不小段布局&#xff0c;代码如下&#xff1a; <ListPreferenceandroid:defaultValue"string/usb_defaul…

list列表的用法

List&#xff08;列表&#xff09;是 Python中使用最频繁的数据类型。列表可以完成大多数集合类的数据结构实现。列表中元素的类型可以不相同&#xff0c;它支持数字&#xff0c;字符串甚至可以包含列表&#xff08;所谓嵌套&#xff09;。列表是写在方括号 [ ] 之间&#xff0…

List 列表的用法

List&#xff08;列表&#xff09; 是 Python 中使用最频繁的数据类型。列表可以完成大多数集合类的数据结构实现。列表中元素的类型可以不相同&#xff0c;它支持数字&#xff0c;字符串甚至可以包含列表&#xff08;所谓嵌套&#xff09;。列表是写在方括号 [ ] 之间、用逗号…

自定义ListPreference弹出Dialog背景

公司最近项目需求是用实体键来在应用内操作,这就需要对那些可点击的widget的背景进行自定义,使其响应focus状态随即变化。大部分的layout改动都是挺简单的。 但是遇到一个主要的问题就是自带的PreferenceFragment,里面的layout不是通过平时常用的Button ImageView那些来写的…

android之ListPreference的用法_PreferenceActivity用法

首先&#xff0c;我们明确&#xff0c;preference是和数据存储相关的。 其次&#xff0c;它能帮助我们方便的进行数据存储&#xff01;为什么这个地方一定要强调下方便的这个词呢&#xff1f;原因是&#xff0c;我们可以根本就不使用&#xff0c;我们有另外的N种办法可…

ListPreference详解与使用

listprefenence比switchpreference多了一个arrays.xml&#xff0c;这个arrays.xml就是用来写我们需要的list的内容。 以切换mode功能为例&#xff0c;就是切换协议的mode&#xff0c;一共需要五个选项。除了switchpreference中的key&#xff0c;title&#xff0c;summary和pers…

互联网协议 — TCP — 流量控制

目录 文章目录 目录TCP 流量控制流量控制处理流程 TCP 流量控制 TCP 流量控制由滑动窗口&#xff08;Sliding Window&#xff09;技术支撑。Sender 根据 Receiver 返回 ACK 中包含的 Window Size 字段来动态调整自身发送 Segments 的速率&#xff0c;以此保证收发双方不会因为…

电信网络性能质量测量

电信网络性能质量测量 作者:千里孤行(http://blog.csdn.net/yanghehong) 为什么要有质量和性能的测量 • 验证系统架构,配置 • 定位已有问题 • 及早发现潜在问题 • 为系统架构演进提供数据支持 服务质量的四个视角 服务质量的网络部分和非网络部分 从网络角度出发, QoS…

网络性能指标简介

网络性能指标简介 1. 网络容量&#xff08;Network Capacity&#xff0c;NC&#xff09; 网络容量是描述无线网络性能的最重要的指标之一&#xff0c;该指标使得人们在给定无线信道的基本容量限制的条件下&#xff0c;能够确定一些应用在理论上是否可行。网络容量通常指理论上…

基于神经网络的天气质量指数预测

基于神经网络的空气质量指数预测 1 项目背景 1.1背景 随着我国经济的快速发展&#xff0c;大量的工厂企业以及尾气排放使得大气环境污染日益严重&#xff0c;所以大气污染的预测防治工作应该加大力度[1]。通过预测未来影响空气质量指数的污染物浓度&#xff0c;实现我们对短…

腾讯海外轻量服务网络质量下降原因和解决方法

腾讯海外轻量服务网络质量下降原因和解决方法 腾讯海外轻量服务网络质量下降原因和解决方法问题背景问题原因影响这个问题是否会自动解决呢?解决方案有吗?方案一: GAME加速.方案二: 使用优质带宽的中转服务器方案三: 让你的服务器提供方帮你一站式解决问题 腾讯海外轻量服务网…