025-支付功能的集成
1. 下载sdk/demo/文档
2. demo尝试的去运行
3. 开始集成-->《移动支付接口SDK2.0标准版接入与使用规则》
1. 添加jar,alipay.jar
2. 添加lib,alipay_lib
3. 添加了一个activity
4. 添加了一些权限
5. 调用支付的核心代码
具体参见
《移动支付接口SDK2.0标准版接入与使用规则》
1.充值业务
//默认情况下,button是不可操作的
btnChongzhi.setClickable(false);
etChongzhi.addTextChangedListener(new TextWatcher()
{
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after)
{
Log.e("TAG", "ChongZhiActivity beforeTextChanged()");
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count)
{
Log.e("TAG", "ChongZhiActivity onTextChanged()");
}
@Override
public void afterTextChanged(Editable s)
{
Log.e("TAG", "ChongZhiActivity afterTextChanged()");
String money = etChongzhi.getText().toString().trim();
if (TextUtils.isEmpty(money))
{
//设置button为不可操作的
btnChongzhi.setClickable(false);
//设置背景颜色
btnChongzhi.setBackgroundResource(R.drawable.btn_02);
}
else
{
//设置button为可操作的
btnChongzhi.setClickable(true);
//设置背景颜色
btnChongzhi.setBackgroundResource(R.drawable.btn_01);
}
}
});
2.提现业务
p2p金融项目当中的提现业务:
1.并不是即时到账
2.业务流程:
用户发送一个提现请求---->经过这个公司审核该请求--->审核通过--->24小时或48小时内将提现的钱款打入收款账户银行卡
MeFragment中
//设置“充值”操作
@OnClick(R.id.recharge)
public void reCharge(View view)
{
((BaseActivity) this.getActivity()).goToActivity(ChongZhiActivity.class, null);
}
提现页面
/**
* @author: Hashub
* @WeChat: NGSHMVP
* @Date: 2018/9/25 16:15
* @function:提现界面
*/
public class TiXianActivity extends BaseActivity
{
@Bind(R.id.iv_title_back)
ImageView ivTitleBack;
@Bind(R.id.tv_title)
TextView tvTitle;
@Bind(R.id.iv_title_setting)
ImageView ivTitleSetting;
@Bind(R.id.account_zhifubao)
TextView accountZhifubao;
@Bind(R.id.select_bank)
RelativeLayout selectBank;
@Bind(R.id.chongzhi_text)
TextView chongzhiText;
@Bind(R.id.view)
View view;
@Bind(R.id.et_input_money)
EditText etInputMoney;
@Bind(R.id.chongzhi_text2)
TextView chongzhiText2;
@Bind(R.id.textView5)
TextView textView5;
@Bind(R.id.btn_tixian)
Button btnTixian;
@Override
protected void initData()
{
//设置当前的体现的button是不可操作的
btnTixian.setClickable(false);
etInputMoney.addTextChangedListener(new TextWatcher()
{
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after)
{
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count)
{
}
@Override
public void afterTextChanged(Editable s)
{
String money = etInputMoney.getText().toString().trim();
if (TextUtils.isEmpty(money))
{
//设置button不可操作的
btnTixian.setClickable(false);
//修改背景颜色
btnTixian.setBackgroundResource(R.drawable.btn_02);
}
else
{
//设置button可操作的
btnTixian.setClickable(true);
//修改背景颜色
btnTixian.setBackgroundResource(R.drawable.btn_01);
}
}
});
}
@Override
protected void initTitle()
{
ivTitleBack.setVisibility(View.VISIBLE);
tvTitle.setText("提现");
ivTitleSetting.setVisibility(View.INVISIBLE);
}
@Override
protected int getLayoutId()
{
return R.layout.activity_ti_xian;
}
@OnClick({R.id.iv_title_back, R.id.btn_tixian})
public void onViewClicked(View view)
{
switch (view.getId())
{
case R.id.iv_title_back:
removeCurrentActivity();
break;
case R.id.btn_tixian:
//将要提现的数据数额发送给后台,由后台连接第三方支付平台,完成金额的提现操作。(略)
//提示用户信息:
UIUtils.toast("您的提现申请已被成功受理。审核通过后,24小时内,你的钱自然会到账", false);
UIUtils.getHandler().postDelayed(new Runnable()
{
@Override
public void run()
{
removeCurrentActivity();
}
}, 2000);
break;
}
}
}
026-MPAndroidChart库的使用
MPAndroidChart:一款基于Android的开源图表库
MPAndroidChart不仅可以在Android设备上绘制各种统计图表,而且可以对图表进行拖动和缩放操作,应用起来非常灵活。MPAndroidChart同样拥有常用的图表类型:线型图、饼状图、柱状图、直方图和散点图,其中直方图支持3d效果。
该库的可扩展性强,代码相对规范,最近一次更新有很大改进,如果不喜欢AChartEngine的过于复杂,可以考虑在此库的基础上开发自己的图表类。
使用方法:
1、直接使用jar方式,需要导入
mpchartlib.jar,nineoldandroidsjar。
2、使用libproject的方式,作为项目依赖。
步骤:
如果使用 LineChart, BarChart, ScatterChart, CandleStickChart or PieChart , 可以直接在xml中定义。
<com.github.mikephil.charting.charts.LineChart
android:id="@+id/chart"
android:layout_width="match_parent"
android:layout_height="match_parent" />
LineChart chart = (LineChart) findViewById(R.id.chart);
或则直接在代码中声明和实例化。
LineChart chart = new LineChart(Context);
主要的Api方法:
setDescription(String desc): 设置表格的描述
setDescriptionTypeface(Typeface t):自定义表格中显示的字体
setDrawYValues(boolean enabled): 设置是否显示y轴的值的数据
setValuePaintColor(int color):设置表格中y轴的值的颜色,但是必须设置setDrawYValues(true)
setValueTypeface(Typeface t):设置字体
setValueFormatter(DecimalFormat format): 设置显示的格式
setPaint(Paint p, int which): 自定义笔刷
public ChartData getDataCurrent():返回ChartData对象当前显示的图表。它包含了所有信息的显示值最小和最大值等
public float getYChartMin(): 返回当前最小值
public float getYChartMax(): 返回当前最大值
public float getAverage(): 返回所有值的平均值
public float getAverage(int type): 返回平均值
public PointF getCenter(): 返回中间点
public Paint getPaint(int which): 得到笔刷
setTouchEnabled(boolean enabled): 设置是否可以触摸,如为false,则不能拖动,缩放等
setDragScaleEnabled(boolean enabled): 设置是否可以拖拽,缩放
setOnChartValueSelectedListener(OnChartValueSelectedListener l): 设置表格上的点,被点击的时候,的回调函数
setHighlightEnabled(boolean enabled): 设置点击value的时候,是否高亮显示
public void highlightValues(Highlight[] highs): 设置高亮显示
saveToGallery(String title): 保存图表到图库中
saveToPath(String title, String pathOnSD): 保存.
setScaleMinima(float x, float y): 设置最小的缩放
centerViewPort(int xIndex, float val): 设置视口
fitScreen(): 适应屏幕
动画:
所有的图表类型都支持下面三种动画,分别是x方向,y方向,xy方向。
animateX(int durationMillis): x轴方向
animateY(int durationMillis): y轴方向
animateXY(int xDuration, int yDuration): xy轴方向
mChart.animateX(3000f); // animate horizontal 3000 milliseconds
// or:
mChart.animateY(3000f); // animate vertical 3000 milliseconds
// or:
mChart.animateXY(3000f, 3000f); // animate horizontal and vertical 3000 milliseconds
注意:如果调用动画方法后,就没有必要调用invalidate()方法,来刷新界面了。
1. 折线图绘制分析与实现
拷贝ListViewMultiChartActivity类的如下两个方法:
private LineData generateDataLine(int cnt) {}去掉参数
private ArrayList<String> getMonths() {}
@Override
protected void initData()
{
mTf = Typeface.createFromAsset(getAssets(), "OpenSans-Regular.ttf");
//设置当前的折线图的描述
lineChart.setDescription("林丹出轨事件的关注度");
//是否绘制网格背景
lineChart.setDrawGridBackground(false);
//获取当前的x轴对象
XAxis xAxis = lineChart.getXAxis();
//设置x轴的显示位置
xAxis.setPosition(XAxis.XAxisPosition.TOP);
//设置x轴的字体
xAxis.setTypeface(mTf);
//是否绘制x轴的网格线
xAxis.setDrawGridLines(false);
//是否绘制x轴的轴线
xAxis.setDrawAxisLine(true);
//获取左边的y轴对象
YAxis leftAxis = lineChart.getAxisLeft();
//设置左边y轴的字体
leftAxis.setTypeface(mTf);
//参数1:左边y轴提供的区间的个数。 参数2:是否均匀分布这几个区间。 false:均匀。 true:不均匀
leftAxis.setLabelCount(5, false);
//获取右边的y轴对象
YAxis rightAxis = lineChart.getAxisRight();
//将右边的y轴设置为不显式的
rightAxis.setEnabled(false);
// 提供折线数据。(通常情况下,折线的数据来自于服务器的数据)
LineData lineData = generateDataLine();
lineChart.setData(lineData);
// 设置x轴方向的动画。执行时间是750.
// 不需要再执行:invalidate();
lineChart.animateX(750);
}
/**
* generates a random ChartData object with just one DataSet
*
* @return
*/
private LineData generateDataLine()
{
//折线1:
ArrayList<Entry> e1 = new ArrayList<Entry>();
//提供折线中点的数据
for (int i = 0; i < 12; i++)
{
e1.add(new Entry((int) (Math.random() * 65) + 40, i));
}
LineDataSet d1 = new LineDataSet(e1, "New DataSet 1");
//设置折线的宽度
d1.setLineWidth(4.5f);
//设置小圆圈的尺寸
d1.setCircleSize(4.5f);
//设置高亮的颜色
d1.setHighLightColor(Color.rgb(244, 0, 0));
//是否显示小圆圈对应的数值
d1.setDrawValues(true);
//折线2:
// ArrayList<Entry> e2 = new ArrayList<Entry>();
//
// for (int i = 0; i < 12; i++) {
// e2.add(new Entry(e1.get(i).getVal() - 30, i));
// }
//
// LineDataSet d2 = new LineDataSet(e2, "New DataSet " + cnt + ", (2)");
// d2.setLineWidth(2.5f);
// d2.setCircleSize(4.5f);
// d2.setHighLightColor(Color.rgb(244, 117, 117));
// d2.setColor(ColorTemplate.VORDIPLOM_COLORS[0]);
// d2.setCircleColor(ColorTemplate.VORDIPLOM_COLORS[0]);
// d2.setDrawValues(false);
ArrayList<LineDataSet> sets = new ArrayList<LineDataSet>();
sets.add(d1);
LineData cd = new LineData(getMonths(), sets);
return cd;
}
private ArrayList<String> getMonths()
{
ArrayList<String> m = new ArrayList<String>();
m.add("Jan");
m.add("Feb");
m.add("Mar");
m.add("Apr");
m.add("May");
m.add("Jun");
m.add("Jul");
m.add("Aug");
m.add("Sep");
m.add("Okt");
m.add("Nov");
m.add("Dec");
return m;
}
柱状图绘制分析与实现
@Override
protected void initData()
{
mTf = Typeface.createFromAsset(getAssets(), "OpenSans-Regular.ttf");
// apply styling
barChart.setDescription("三星note7爆炸门事件后,三星品牌度");
barChart.setDrawGridBackground(false);
//是否绘制柱状图的背景
barChart.setDrawBarShadow(false);
//获取x轴对象
XAxis xAxis = barChart.getXAxis();
//设置x轴的显示位置
xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);
//设置x轴的字体
xAxis.setTypeface(mTf);
//是否绘制x轴的网格线
xAxis.setDrawGridLines(false);
//是否绘制x轴的轴线
xAxis.setDrawAxisLine(true);
//获取左边y轴对象
YAxis leftAxis = barChart.getAxisLeft();
//设置y轴的字体
leftAxis.setTypeface(mTf);
//参数1:左边y轴提供的区间的个数。 参数2:是否均匀分布这几个区间。 false:均匀。 true:不均匀
leftAxis.setLabelCount(5, false);
//设置最大值距离顶部的距离
leftAxis.setSpaceTop(0);
YAxis rightAxis = barChart.getAxisRight();
rightAxis.setEnabled(false);
//提供柱状图的数据
BarData barData = generateDataBar();
barData.setValueTypeface(mTf);
// set data
barChart.setData(barData);
// 设置y轴方向的动画
barChart.animateY(700);
}
/**
* generates a random ChartData object with just one DataSet
*
* @return
*/
private BarData generateDataBar()
{
ArrayList<BarEntry> entries = new ArrayList<BarEntry>();
for (int i = 0; i < 12; i++)
{
entries.add(new BarEntry((int) (Math.random() * 70) + 30, i));
}
BarDataSet d = new BarDataSet(entries, "New DataSet 1");
//设置相邻的柱状图之间的距离
d.setBarSpacePercent(40f);
d.setColors(ColorTemplate.VORDIPLOM_COLORS);
//设置高亮的透明度
d.setHighLightAlpha(255);
BarData cd = new BarData(getMonths(), d);
return cd;
}
private ArrayList<String> getMonths()
{
ArrayList<String> m = new ArrayList<String>();
m.add("Jan");
m.add("Feb");
m.add("Mar");
m.add("Apr");
m.add("May");
m.add("Jun");
m.add("Jul");
m.add("Aug");
m.add("Sep");
m.add("Okt");
m.add("Nov");
m.add("Dec");
return m;
}
3. 饼状图绘制分析与实现
private Typeface mTf;//声明字体库
@Override
protected void initData()
{
mTf = Typeface.createFromAsset(getAssets(), "OpenSans-Regular.ttf");
// apply styling
pieChart.setDescription("android厂商2016年手机占有率");
pieChart.setHoleRadius(52f);//最内层的圆的半径
pieChart.setTransparentCircleRadius(77f);//包裹内层圆的半径
pieChart.setCenterText("Android\n厂商占比");
pieChart.setCenterTextTypeface(mTf);
pieChart.setCenterTextSize(18f);
//是否使用百分比。true:各部分的百分比的和是100%。
pieChart.setUsePercentValues(true);
PieData pieData = generateDataPie();
pieData.setValueFormatter(new PercentFormatter());
pieData.setValueTypeface(mTf);
pieData.setValueTextSize(11f);
pieData.setValueTextColor(Color.RED);
// set data
pieChart.setData(pieData);
//获取右上角的描述结构的对象
Legend l = pieChart.getLegend();
l.setPosition(Legend.LegendPosition.RIGHT_OF_CHART);
l.setYEntrySpace(10f);//相邻的entry在y轴上的间距
l.setYOffset(30f);//第一个entry距离最顶端的间距
// do not forget to refresh the chart
// pieChart.invalidate();
pieChart.animateXY(900, 900);
}
/**
* generates a random ChartData object with just one DataSet
*
* @return
*/
private PieData generateDataPie()
{
ArrayList<Entry> entries = new ArrayList<Entry>();
for (int i = 0; i < 4; i++)
{
entries.add(new Entry((int) (Math.random() * 70) + 30, i));
}
PieDataSet d = new PieDataSet(entries, "");
// 相邻模块的间距
d.setSliceSpace(2f);
d.setColors(ColorTemplate.VORDIPLOM_COLORS);
PieData cd = new PieData(getQuarters(), d);
return cd;
}
private ArrayList<String> getQuarters()
{
ArrayList<String> q = new ArrayList<String>();
q.add("三星");
q.add("华为");
q.add("oppo");
q.add("vivo");
return q;
}
027-MoreFragment的布局设置
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<include layout="@layout/common_title"></include>
<com.example.p2pinvest.ui.MyScrollView
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:id="@+id/tv_more_regist"
android:text="用户注册"
android:drawableLeft="@drawable/icon_more_regist"
android:layout_width="match_parent"
style="@style/MoreTextStyle" />
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="@color/divider_line"></View>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:text="手势密码"
android:drawableLeft="@drawable/icon_more_secret"
android:layout_width="wrap_content"
style="@style/MoreTextStyle" />
<ToggleButton
android:id="@+id/toggle_more"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:layout_marginRight="10dp"
android:background="@drawable/toggle_selector"
android:textOn=""
android:textOff=""
/>
</RelativeLayout>
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="@color/divider_line"></View>
<TextView
android:id="@+id/tv_more_reset"
android:text="重置手势密码"
android:drawableLeft="@drawable/icon_more_reset"
android:layout_width="match_parent"
style="@style/MoreTextStyle" />
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="@color/divider_line"></View>
<RelativeLayout
android:id="@+id/rl_more_contact"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:text="联系客服"
android:drawableLeft="@drawable/icon_more_contact"
android:layout_width="wrap_content"
style="@style/MoreTextStyle" />
<TextView
android:id="@+id/tv_more_phone"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="010-56253825"
android:textColor="@android:color/holo_red_dark"
android:textSize="20sp"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:layout_marginRight="10dp"
/>
</RelativeLayout>
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="@color/divider_line"></View>
<TextView
android:id="@+id/tv_more_fankui"
android:text="用户反馈"
android:drawableLeft="@drawable/icon_more_sms"
android:layout_width="match_parent"
style="@style/MoreTextStyle" />
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="@color/divider_line"></View>
<TextView
android:id="@+id/tv_more_share"
android:text="分享给好友"
android:drawableLeft="@drawable/icon_more_share"
android:layout_width="match_parent"
style="@style/MoreTextStyle" />
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="@color/divider_line"></View>
<TextView
android:id="@+id/tv_more_about"
android:text="关于硅谷理财"
android:drawableLeft="@drawable/icon_more_about"
android:layout_width="match_parent"
style="@style/MoreTextStyle" />
</LinearLayout>
</com.example.p2pinvest.ui.MyScrollView>
</LinearLayout>
2.ToggleButton的使用
<ToggleButton
android:id="@+id/toggle_more_secret"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:layout_marginBottom="3dp"
android:layout_marginRight="5dp"
android:background="@drawable/toggle_selector"
android:textOff=""
android:textOn="" />
**************************
设置选择器:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:state_checked="true"
android:drawable="@drawable/toggle_on"
></item>
<item
android:state_checked="false"
android:drawable="@drawable/toggle_off"
></item>
</selector>
028-用户注册功能的实现
需要客户端提交数据前判断的逻辑:
1.输入的信息不能为空
2.两次输入的密码是否不一致
3.在请求到服务器以后,需要判断服务器端是否已经注册过此手机号
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<include layout="@layout/common_top" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="44dp"
android:gravity="center_vertical"
android:background="@color/white"
android:paddingLeft="17dp"
android:paddingRight="17dp">
<TextView
android:layout_width="95dp"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:text="手机号:"
android:textColor="#333333"
android:textSize="14sp" />
<EditText
android:id="@+id/et_register_number"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@null"
android:hint="请输入手机号"
android:inputType="phone"
android:maxLines="1"
android:singleLine="true"
android:textColor="#5c5c5c"
android:textSize="14sp" />
</LinearLayout>
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="?android:listDivider" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="44dp"
android:gravity="center_vertical"
android:background="@color/white"
android:paddingLeft="17dp"
android:paddingRight="17dp">
<TextView
android:layout_width="95dp"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:text="用户名:"
android:textColor="#333333"
android:textSize="14sp" />
<EditText
android:id="@+id/et_register_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@null"
android:hint="请输入用户名"
android:inputType="text"
android:maxLines="1"
android:singleLine="true"
android:textColor="#5c5c5c"
android:textSize="14sp" />
</LinearLayout>
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="?android:listDivider" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="44dp"
android:gravity="center_vertical"
android:background="@color/white"
android:paddingLeft="17dp"
android:paddingRight="17dp">
<TextView
android:layout_width="95dp"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:text="密码:"
android:textColor="#333333"
android:textSize="14sp" />
<EditText
android:id="@+id/et_register_pwd"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@null"
android:hint="请输入密码"
android:inputType="textPassword"
android:maxLines="1"
android:singleLine="true"
android:textColor="#5c5c5c"
android:textSize="14sp" />
</LinearLayout>
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="?android:listDivider" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="44dp"
android:gravity="center_vertical"
android:background="@color/white"
android:paddingLeft="17dp"
android:paddingRight="17dp">
<TextView
android:layout_width="95dp"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:text="确认密码:"
android:textColor="#333333"
android:textSize="14sp" />
<EditText
android:id="@+id/et_register_pwdagain"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@null"
android:hint="请输入手机号"
android:inputType="textPassword"
android:maxLines="1"
android:singleLine="true"
android:textColor="#5c5c5c"
android:textSize="14sp" />
</LinearLayout>
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="?android:listDivider" />
<Button
android:id="@+id/btn_register"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:layout_marginTop="15dp"
android:background="@drawable/btn_01"
android:text="注 册"
android:textColor="#ffffff"
android:textSize="18sp" />
</LinearLayout>
//设置“注册”button的点击事件
btnRegister.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
//1.获取用户注册的信息
String name = etRegisterName.getText().toString().trim();
String number = etRegisterNumber.getText().toString().trim();
String pwd = etRegisterPwd.getText().toString().trim();
String pwdAgain = etRegisterPwdagain.getText().toString().trim();
//2.所填写的信息不能为空
if (TextUtils.isEmpty(name) || TextUtils.isEmpty(number) || TextUtils.isEmpty(pwd) || TextUtils.isEmpty(pwdAgain))
{
UIUtils.toast("填写的信息不能为空", false);
}
else if (!pwd.equals(pwdAgain))
{//2.两次密码必须一致
UIUtils.toast("两次填写的密码不一致", false);
etRegisterPwd.setText("");
etRegisterPwdagain.setText("");
}
else
{
//3.联网发送用户注册信息
String url = AppNetConfig.USERREGISTER;
RequestParams params = new RequestParams();
// name = new String(name.getBytes(),"UTF-8");
params.put("name", name);
params.put("password", MD5Utils.MD5(pwd));
params.put("phone", number);
client.post(url, params, new AsyncHttpResponseHandler()
{
@Override
public void onSuccess(String content)
{
JSONObject jsonObject = JSON.parseObject(content);
boolean isExist = jsonObject.getBoolean("isExist");
if (isExist)
{//已经注册过
UIUtils.toast("此用户已注册", false);
}
else
{
UIUtils.toast("注册成功", false);
}
}
@Override
public void onFailure(Throwable error, String content)
{
UIUtils.toast("联网请求失败", false);
}
});
}
}
});
}
1. 乱码问题
原则:要求客户端与服务器端编码集一致。
客户端:
将str转换为UTF-8:
new String(str.getBytes(), "UTF-8");
服务器端:
request.setCharacterEncoding("UTF-8");
029-手势密码开关设置
1. 获取ToggleButton的保存状态
private void getGestureStatus()
{
boolean isOpen = sp.getBoolean("isOpen", false);
toggleMore.setChecked(isOpen);
}
2. 设置监和听设置手势开关操作
private void setGesturePassword()
{
toggleMore.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener()
{
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)
{
if (isChecked)
{
// UIUtils.toast("开启了手势密码", false);
// sp.edit().putBoolean("isOpen", true).commit();
String inputCode = sp.getString("inputCode", "");
if (TextUtils.isEmpty(inputCode))
{//之前没有设置过
new AlertDialog.Builder(MoreFragment.this.getActivity())
.setTitle("设置手势密码")
.setMessage("是否现在设置手势密码")
.setPositiveButton("确定", new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which)
{
UIUtils.toast("现在设置手势密码", false);
sp.edit().putBoolean("isOpen", true).commit();
// toggleMore.setChecked(true);
//开启新的activity:
((BaseActivity) MoreFragment.this.getActivity()).goToActivity(GestureEditActivity.class, null);
}
})
.setNegativeButton("取消", new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which)
{
UIUtils.toast("取消了现在设置手势密码", false);
sp.edit().putBoolean("isOpen", false).commit();
toggleMore.setChecked(false);
}
})
.show();
}
else
{
UIUtils.toast("开启手势密码", false);
sp.edit().putBoolean("isOpen", true).commit();
// toggleMore.setChecked(true);
}
}
else
{
UIUtils.toast("关闭了手势密码", false);
sp.edit().putBoolean("isOpen", false).commit();
// toggleMore.setChecked(false);
}
}
});
}
3. 判断本地用户是否开启了手势密码,如果开启,需要校验
在MeFragment中:
如果用户没有登录,则按照原来的操作:提示用户登录。
如果用户登录了,则在doUser()的读取用户登录数据的操作中:
//判断本地用户是否开启了手势密码,如果开启,需要进入
//判断一下,是否开启了手势密码。如果开启:先输入手势密码
SharedPreferences sp = this.getActivity().getSharedPreferences("secret_protect", Context.MODE_PRIVATE);
boolean isOpen = sp.getBoolean("isOpen", false);
if (isOpen)
{
((BaseActivity) this.getActivity()).goToActivity(GestureVerifyActivity.class, null);
return;
}
30-重置手势密码
private void resetGesture()
{
tvMoreReset.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
boolean checked = toggleMore.isChecked();
if (checked)
{
((BaseActivity) MoreFragment.this.getActivity()).goToActivity(GestureEditActivity.class, null);
}
else
{
UIUtils.toast("手势密码操作已关闭,请开启后再设置", false);
}
}
});
}
31-联系客服
private void contactService()
{
rlMoreContact.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
new AlertDialog.Builder(MoreFragment.this.getActivity())
.setTitle("联系客服")
.setMessage("是否现在联系客服:010-56253825")
.setPositiveButton("确定", new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which)
{
//获取手机号码
String phone = tvMorePhone.getText().toString().trim();
//使用隐式意图,启动系统拨号应用界面
Intent intent = new Intent(Intent.ACTION_CALL);
intent.setData(Uri.parse("tel:" + phone));
MoreFragment.this.getActivity().startActivity(intent);
}
})
.setNegativeButton("取消", null)
.show();
}
});
}
32-用户反馈
private String department = "不明确";
private void commitFanKui()
{
tvMoreFankui.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
//提供一个View
View view = View.inflate(MoreFragment.this.getActivity(), R.layout.view_fankui, null);
final RadioGroup rg = (RadioGroup) view.findViewById(R.id.rg_fankui);
final EditText et_fankui_content = (EditText) view.findViewById(R.id.et_fankui_content);
rg.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener()
{
@Override
public void onCheckedChanged(RadioGroup group, int checkedId)
{
RadioButton rb = (RadioButton) rg.findViewById(checkedId);
department = rb.getText().toString();
}
});
new AlertDialog.Builder(MoreFragment.this.getActivity())
.setView(view)
.setPositiveButton("确定", new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which)
{
//获取反馈的信息
String content = et_fankui_content.getText().toString();
//联网发送反馈信息
AsyncHttpClient client = new AsyncHttpClient();
String url = AppNetConfig.FEEDBACK;
RequestParams params = new RequestParams();
params.put("department", department);
params.put("content", content);
client.post(url, params, new AsyncHttpResponseHandler()
{
@Override
public void onSuccess(String content)
{
UIUtils.toast("发送反馈信息成功", false);
}
@Override
public void onFailure(Throwable error, String content)
{
UIUtils.toast("发送反馈信息失败", false);
}
});
}
})
.setNegativeButton("取消", null)
.show();
}
});
}
33-分享给好友
1. 常用的分享框架
1.常用的分享功能实现的框架
2.sharesdk说明:
ShareSDK是一种社会化分享组件,为iOS、Android、WP8 的APP提供社会化功能,集成了一些常用的类库和接口,缩短开发者的开发时间,还有社会化统计分析管理后台。
支持包括QQ、微信、新浪微博、腾讯微博、开心网、人人网、豆瓣、网易微博、搜狐微博、facebook、twitter、google+等国内外40多家的主流社交平台,帮助开发者轻松实现社会化分享、登录、关注、获得用户资料、获取好友列表等主流的社会化功能,强大的统计分析管理后台,可以实时了解用户、信息流、回流率、传播效率等数据,有效地指导移动APP的日常运营与推广,同时为APP引入更多的社会化流量。
2. 如何集成sharesdk
1.进入官网http://mob.com/,注册或登录
2.下载之前,先创建一个应用,并获取自动生成的key。
key:19871766f26ac
3.下载ShareSDK for Android,同时需要的话,还可以下载官方的demo源码这里根据需要选择合适的社交平台。
4.接着按照快速集成指南完成配置
第一步:使快速工具进行集成
解压后,进入ShareSDK解压目录,打开“Share SDK for Android”目录,可以找到“QuickIntegrater.jar”,这个就是快速集成ShareSDK的工具
window下:
首先确定您已经安装了JDK,并且正确配置了JAVA_HOME和PATH系统变量,此时您可以双击QuickIntegrater启动程序
如果不能正常双击启动,还可以在命令行执行:
当前目录下,shift+右键打开cmd命令行执行如下命令:
javaw -jar QuickIntegrater.jar
根据项目的AndroidMenifest.xml和Gradle文件正确输入项目的名称和包名,勾选需要的集成的平台,然后点击“确定”。
QuickIntegrater会自行产生一个文件夹,(如上)复制此文件夹中所有文件到您的项目中覆盖即可。
第二步:配置AndroidManifest.xml
1、添加权限
<uses-permission android:name="android.permission.GET_TASKS" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.MANAGE_ACCOUNTS"/>
<uses-permission android:name="android.permission.GET_ACCOUNTS"/>
<!-- 蓝牙分享所需的权限 -->
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
2、添加activity信息
<activity
android:name="com.mob.tools.MobUIShell"
android:theme="@android:style/Theme.Translucent.NoTitleBar"
android:configChanges="keyboardHidden|orientation|screenSize"
android:screenOrientation="portrait"
android:windowSoftInputMode="stateHidden|adjustResize" >
<intent-filter>
<data android:scheme="tencent100371282" />
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.BROWSABLE" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
<!-- 调用新浪原生SDK,需要注册的回调activity -->
<intent-filter>
<action android:name="com.sina.weibo.sdk.action.ACTION_SDK_REQ_ACTIVITY" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
3、如果您集成了微信,易信,支付宝还需要添加下面回调的activity处理;
(集成了哪个,就添加哪个的声明)
<!--微信分享回调 -->
<activity
android:name=".wxapi.WXEntryActivity"
android:theme="@android:style/Theme.Translucent.NoTitleBar"
android:configChanges="keyboardHidden|orientation|screenSize"
android:exported="true"
android:screenOrientation="portrait" />
<!--易信分享回调 -->
<activity
android:name=".yxapi.YXEntryActivity"
android:theme="@android:style/Theme.Translucent.NoTitleBar"
android:configChanges="keyboardHidden|orientation|screenSize"
android:exported="true"
android:screenOrientation="portrait" />
<!-- 支付宝分享回调 -->
<activity
android:name=".apshare.ShareEntryActivity"
android:theme="@android:style/Theme.Translucent.NoTitleBar"
android:configChanges="keyboardHidden|orientation|screenSize"
android:exported="true"/>
4、替换mob后台申请的Appkey与各个平台申请的key
注意:这里提到我们需要在新浪微博平台提供一个应用,在这里做好配置。这样分享就会显示来自于比如“尚硅谷”。如果不写呢,这里发现也提供了默认的值,比如会显示来自于sharesdk.真正工作的时候,项目中要替换掉,去微博去注册。
第三步:添加分享代码
在您程序启动的时候添加初始化代码(注:不要等调用ShareSDK功能之前才初始化)
ShareSDK.initSDK(this);
在您的代码中调用此方法,即可打开一键分享功能进行分享
private void showShare() {
OnekeyShare oks = new OnekeyShare();
//关闭sso授权
oks.disableSSOWhenAuthorize();
// title标题,印象笔记、邮箱、信息、微信、人人网、QQ和QQ空间使用
oks.setTitle(getResources().getString(R.string.app_name));
// titleUrl是标题的网络链接,仅在Linked-in,QQ和QQ空间使用
oks.setTitleUrl("http://www.atguigu.com");
// text是分享文本,所有平台都需要这个字段
oks.setText("世界上最遥远的距离,是我在if里你在else里,似乎一直相伴又永远分离;\n" +
" 世界上最痴心的等待,是我当case你是switch,或许永远都选不上自己;\n" +
" 世界上最真情的相依,是你在try我在catch。无论你发神马脾气,我都默默承受,静静处理。到那时,再来期待我们的finally。");
//分享网络图片,新浪微博分享网络图片需要通过审核后申请高级写入接口,否则请注释掉测试新浪微博
oks.setImageUrl("http://f1.sharesdk.cn/imgs/2014/02/26/owWpLZo_638x960.jpg");
// imagePath是图片的本地路径,Linked-In以外的平台都支持此参数
//oks.setImagePath("/sdcard/test.jpg");//确保SDcard下面存在此张图片
// url仅在微信(包括好友和朋友圈)中使用
oks.setUrl("http://www.atguigu.com");
// comment是我对这条分享的评论,仅在人人网和QQ空间使用
oks.setComment("word妈呀,精辟的不要不要的!");
// site是分享此内容的网站名称,仅在QQ空间使用
oks.setSite(getResources().getString(R.string.app_name));
// siteUrl是分享此内容的网站地址,仅在QQ空间使用
oks.setSiteUrl("http://www.atguigu.com");
// 启动分享GUI
oks.show(this.getActivity());
}










网友评论