Android—创建自己的Dialog—数据交互
来源:互联网 发布:大麦户源码程序 编辑:程序博客网 时间:2024/04/26 16:12
之所以涉及到这,是因为今天天气不错想着干点什么呢,同时在自己的App上添加一项新功能,第一项就是想添加一个可选择功能的dialog,在Android的App里发现咕咚App的运动类型选择的Dialog真的是漂亮,先上图:
下面就参考了这个界面做一下,思路是创建一个Activity让其Theme
android:launchMode="singleTask"android:screenOrientation="portrait" <!-- 限制此页面数竖屏显示。!-->android:theme="@style/load_dialog"
<style name="load_dialog" parent="@android:style/Theme.Dialog"> <item name="android:colorBackgroundCacheHint">@null</item> <item name="android:windowFrame">@null</item> <!-- 边框 --> <item name="android:windowIsFloating">true</item> <!-- 是否浮现在activity之上 --> <item name="android:windowIsTranslucent">true</item> <!-- 半透明 --> <item name="android:windowNoTitle">true</item> <!-- 无标题 --> <!-- <item name="android:background">@drawable/dialog_type</item> dialog背景样式 --> <item name="android:windowBackground">@android:color/transparent</item> <!-- 背景透明 --> <item name="android:backgroundDimEnabled">false</item> <!-- 模糊 --> </style>
这样就将Activity设置成功了,接下来就是设置显示的Xml文件,代码如下:
运动类型用 网格状的RadioGroup 完成。
首先为每个选项创建由Img和Text组合而成的、外形类似于RadioButton的组合View视图(下面简称URadioButton)
先看URadioButton的布局,上图标下文字:只需要把图片或文字填充到或中就可以实现内容不同的URadioButton
item_type_radiobutton.xml:
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" android:layout_gravity="center" android:gravity="center"> <com.ppl.get_loc.view.CircleImageView android:id="@+id/civ_item_gd" android:layout_width="50dip" android:layout_height="50dip" android:scaleType="centerCrop" android:background="@android:color/transparent" /> <TextView android:id="@+id/tv_item_gd" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="10dp"/></LinearLayout>
dialog 的XML文件的代码如下:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/dialog_type" android:orientation="vertical" > <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@drawable/dialog_sport_type_title" > <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_centerInParent="true" android:layout_marginTop="20dp" android:gravity="center_horizontal" android:text="选择运动类型" android:textColor="@color/orange" android:textSize="20sp" /> <ImageButton android:id="@+id/ib_dialog_type_close" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_centerVertical="true" android:layout_marginRight="5dp" android:background="@android:color/transparent" android:src="@drawable/v5_0_1_webview_stop_button" /> </RelativeLayout> <GridView android:layout_marginTop="10dp" android:layout_marginBottom="10dp" android:id="@+id/gb_sport_type" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center" android:gravity="center" android:horizontalSpacing="5dip" android:numColumns="3" android:stretchMode="columnWidth" android:verticalSpacing="5dip" > </GridView></LinearLayout>
为了使对话框边界呈现出弧形重写了背景,代码下:
<?xml version="1.0" encoding="utf-8"?><shape xmlns:android="http://schemas.android.com/apk/res/android" > <solid android:color="#ffffff" /> <stroke android:width="2dp" android:color="#ff00ff00" /> <corners android:radius="15dp" /> <padding android:bottom="2dp" android:left="2dp" android:right="2dp" android:top="2dp" /></shape>
为了使标题更漂亮,未标题写的背景代码如下:
<?xml version="1.0" encoding="utf-8"?><shape xmlns:android="http://schemas.android.com/apk/res/android" > <gradient android:angle="0" android:centerColor="#93c1f2" android:endColor="#000000" android:startColor="#000000" /> <corners android:topLeftRadius="15dp" android:topRightRadius="15dp" /></shape>
至此完成了对话框的页面布局,现在只差为GridView写适配器,其中注意俩点,
一:记住选择运动类型,所以需要把每次选中的运动类型进行保存,保存方法类似保存登陆用户信息的方法,每次进入软件时读取之前保存的运动方式,确定主页运动方式的标签。
二:标签更新,意思是选中的运动方式与其他运动图片的区别,我采用的是,当点击运动时,对点击的该运动与前一运动状态的更新,完成连续点击能及时更新,代码如下所示:
package com.ppl.get_loc.ui;import java.util.ArrayList;import java.util.HashMap;import android.app.Activity;import android.content.Context;import android.content.SharedPreferences;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.AdapterView;import android.widget.AdapterView.OnItemClickListener;import android.widget.GridView;import android.widget.ImageButton;import com.ppl.get_loc.R;import com.ppl.get_loc.utils.PublicData;public class ActivitySportType extends Activity { private ImageButton ib_dialog_type_close; private GridView gb_sport_type; private int[] img_res = {R.drawable.bike,R.drawable.jogging,R.drawable.mountaineer,R.drawable.caneeing, R.drawable.swimmingpng,R.drawable.windurfing}; private String[] sport_type = {"骑行","跑步","爬山","划船","游泳","帆船"}; private ArrayList<HashMap<String, Object>>data; private Context mContext; private SharedPreferences sharedPreferences; //对数据进行编辑 private SharedPreferences.Editor editor; private GVSportAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub setContentView(R.layout.activity_activity_sport_type); super.onCreate(savedInstanceState); initView(); initData(); } private void initView() { // TODO Auto-generated method stub ib_dialog_type_close = (ImageButton)findViewById(R.id.ib_dialog_type_close); gb_sport_type = (GridView)findViewById(R.id.gb_sport_type); mContext = getApplicationContext(); sharedPreferences = mContext.getSharedPreferences(PublicData.sportTypeFile, Context.MODE_PRIVATE); editor = sharedPreferences.edit(); } private void initData() { // TODO Auto-generated method stub ib_dialog_type_close.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub } }); data = new ArrayList<HashMap<String,Object>>(); for(int i=0;i<sport_type.length;i++){ if(i == PublicData.sportType){ HashMap<String, Object> map = new HashMap<String, Object>(); map.put("text", sport_type[i]); map.put("img", PublicData.img_res_ligt[i]); data.add(map); }else{ HashMap<String, Object> map = new HashMap<String, Object>(); map.put("text", sport_type[i]); map.put("img", img_res[i]); data.add(map); } } adapter = new GVSportAdapter(mContext, data); gb_sport_type.setAdapter(adapter); gb_sport_type.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { //对数据进行读取 PublicData.sportType = sharedPreferences.getInt(PublicData.keySportType, 0); HashMap<String, Object> map_to_gray = (HashMap<String, Object>)data.get(PublicData.sportType); map_to_gray.put("img", img_res[PublicData.sportType]); HashMap<String, Object> map_ligt = (HashMap<String, Object>)data.get(arg2); map_ligt.put("img",PublicData.img_res_ligt[arg2]); editor.putInt(PublicData.keySportType, arg2); editor.commit(); adapter.notifyDataSetChanged(); } }); }}
效果如下图所示:
接下来就是,当选中运动类型后,数据交互。
通过两部完成数据交互:
1.启动dialog时,用的是:startActivityForResult;
private void selectSportType() { // TODO Auto-generated method stub Intent intent = new Intent(); intent.setClass(getActivity(), ActivitySportType.class); startActivityForResult(intent, SELECT_TYPE); }
2.调用finish前调用setResult,向调用Activity返回一个结果。
哎呦,新发现:因为这个Activity的主题设置为dialog,发现执行顺序是 startActivityForResult 后直接执行 onActivityResult 然后才启动以dialog为主题的Activity,当Activity执行结束setResult后finish后不执行onActivityResult 。新鲜喽。
饿了,阴天了,可能会下雨了,而且没网了,所以下班了,明天继续。
查资料得到这样的方法:
方法如下:
假设:主Activity为MainActivity;被调用的Dialog类为SampleDialog
此时我们需定义一个接口类:
interface MyListener{
public void refreshActivity(String text);
}
在SampleDIalog的构造函数中传入MyListener:
public MyListener (MyListener myListener){
this.mMyListener = myListener;
}
并且在需要返回的地方调用refreshActivity()方法:
mMyListener.refreshActivity();
然后在MainActivity中实现MyListener接口,并在show Dialog时传入实现的myListener:
private MyListener myListener = new MyListener(){
@Override
public void refreshActivity(String text){
this.mTextView1.setText(text);
}
}
};new SampleDialog(myListener).show;
这样便能从Dialog返回需要的数据。
我采用的是将选择的运动方式保存成全局的变量,在finish掉以Dialog为主题的activity后返回原activity时,在OnResume中刷新。完成!
- Android—创建自己的Dialog—数据交互
- Android—点击自定义dialog窗体的控件销毁自己
- Dialog中 不同Recycleview的数据交互
- Android中各类Dialog实例——交互
- Android Dialog 列表的创建
- android dialog 收集整理集合 自己的dialog库
- android ui定义自己的dialog
- Android中对话框(Dialog)的创建方法
- Android中的对话框(dialog)的创建方法
- Android中对话框(Dialog)的创建方法
- Android中对话框Dialog的创建
- Android 创建Dialog
- Android 创建Dialog
- android创建自定义dialog
- android 创建Dialog
- android 代码创建dialog
- 定义自己的dialog
- 定义自己的dialog
- linux 超级用户切换
- Cocos studio v3.10记录(一)
- 腾讯云服务器ftp部署及文件上传
- C Primer Plus 中文版 前言
- Hibernate注解-类级别注解
- Android—创建自己的Dialog—数据交互
- 数据预处理系列:(十七)用随机梯度下降处理回归
- 一张图玩转大数据架构流程
- http长连接和短连接
- scrollWidth/offsetWidth
- python 模块概述
- 排序算法-快速排序
- 《Effective C++》读后感
- javascript贪吃蛇小游戏