亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > Android > 正文

android+json+php+mysql實現用戶反饋功能方法解析

2020-04-11 12:42:23
字體:
來源:轉載
供稿:網友
相信每個項目都會有用戶反饋建議等功能,這個實現的方法很多,下面是我實現的方法,供大家交流。首先看具體界面,三個字段。名字,郵箱為選填,可以為空,建議不能為空。如有需要可以給我留言。
 
下面貼出布局代碼,這里用到一個<include layout="@layout/uphead">就是把另外一個布局文件引入到這個布局中。
復制代碼 代碼如下:

<?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"
android:background="@color/bg_gray" >
<include layout="@layout/uphead"/>
<!-- Name Label -->
<TextView android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="名字(選填)"
android:paddingLeft="10dip"
android:paddingRight="10dip"
android:textColor="@color/coffee"
android:paddingTop="10dip"
android:textSize="12sp"/>
<!-- Input Name -->
<EditText android:id="@+id/inputName"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_margin="5dip"
android:layout_marginBottom="15dip"
android:singleLine="true"/>
<!-- Price Label -->
<TextView android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="郵箱(選填)"
android:paddingLeft="10dip"
android:paddingRight="10dip"
android:textColor="@color/coffee"
android:paddingTop="10dip"
android:textSize="12sp"/>
<!-- Input Price -->
<EditText android:id="@+id/inputEmail"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_margin="5dip"
android:layout_marginBottom="15dip"
android:singleLine="true"/>
<!-- Description Label -->
<TextView android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="建議(必填)"
android:paddingLeft="10dip"
android:paddingRight="10dip"
android:paddingTop="10dip"
android:textColor="@color/coffee"
android:textSize="12sp"/>
<!-- Input description -->
<EditText android:id="@+id/inputDesc"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_margin="5dip"
android:layout_marginBottom="15dip"
android:lines="4"
android:gravity="top"/>
<!-- Button Create Product -->
<Button android:id="@+id/btnCreateProduct"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="提交"
android:textSize="20sp"
android:textColor="@color/coffee"
/>
</LinearLayout>

下面貼出uphead的布局代碼,里面用到一個TextView,一個Button為返回按鈕。
復制代碼 代碼如下:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="50dp"
android:background="@drawable/top" >
<TextView
android:id="@+id/tv_head"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:shadowColor="#ff000000"
android:shadowDx="2"
android:shadowDy="0"
android:shadowRadius="1"
android:text=""
android:textColor="@color/white"
android:textSize="18sp"
android:textStyle="bold" />
<Button
android:id="@+id/upback"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_centerVertical="true"
android:layout_marginLeft="17dp"
android:drawableLeft="@id/tv_head"
android:background="@drawable/back" />
</RelativeLayout>

下面貼出android客戶端代碼,三個類,一個用于與服務器交互發送post請求,以及json的傳遞。還有一個Dailog實例。
復制代碼 代碼如下:

package com.android.up;
import java.util.ArrayList;
import java.util.List;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.message.BasicNameValuePair;
import org.json.JSONObject;
import com.android.MainActivity;
import com.android.R;
import com.anroid.net.DialogUtil;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class up extends Activity {
// Progress Dialog
private ProgressDialog pDialog;
private TextView tv_head;
JSONParser jsonParser = new JSONParser();
EditText inputName;
EditText inputEmail;
EditText inputDesc;
Button upback;
// url to create new product
private static String url_up = "http://10.0.2.2/up/up.php";//此處寫的是你的服務器端的地址
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.up);
tv_head = (TextView)findViewById(R.id.tv_head);
tv_head.setText("建議");
// Edit Text
inputName = (EditText) findViewById(R.id.inputName);
inputEmail = (EditText) findViewById(R.id.inputEmail);
inputDesc = (EditText) findViewById(R.id.inputDesc);
upback = (Button)findViewById(R.id.upback);
upback.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
Intent back = new Intent(up.this,MainActivity.class);
back.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(back);
up.this.finish();
}
});
// Create button
Button btnCreateProduct = (Button) findViewById(R.id.btnCreateProduct);
// button click event
btnCreateProduct.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
// creating new product in background thread
if(validate()){
new Up().execute();
}
}
});
}
private boolean validate()
{
String description = inputDesc.getText().toString().trim();
if (description.equals(""))
{
DialogUtil.showDialog(this, "您還沒有填寫建議", false);
return false;
}
return true;
}
/**
* Background Async Task to Create new product
* */
class Up extends AsyncTask<String, String, String> {
/**
* Before starting background thread Show Progress Dialog
* */
@Override
protected void onPreExecute() {
super.onPreExecute();
pDialog = new ProgressDialog(up.this);
pDialog.setMessage("正在上傳..");
pDialog.setIndeterminate(false);
pDialog.setCancelable(true);
pDialog.show();
}
/**
* Creating product
* */
protected String doInBackground(String... args) {
String name = inputName.getText().toString();
String price = inputEmail.getText().toString();
String description = inputDesc.getText().toString();
// Building Parameters
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("name", name));
params.add(new BasicNameValuePair("email", price));
params.add(new BasicNameValuePair("description", description));
// getting JSON Object
// Note that create product url accepts POST method
try{
JSONObject json = jsonParser.makeHttpRequest(url_up,
"POST", params);
}catch(Exception e){
e.printStackTrace();
}
// check for success tag
return null;
}
/**
* After completing background task Dismiss the progress dialog
* **/
protected void onPostExecute(String file_url) {
pDialog.setMessage("上傳成功");
pDialog.dismiss();

}
}
}

下面貼出Dailog實例類
復制代碼 代碼如下:

/**
*
*/
package com.anroid.net;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.view.View;
import android.app.Activity;
public class DialogUtil
{
// 定義一個顯示消息的對話框
public static void showDialog(final Context ctx
, String msg , boolean closeSelf)
{
// 創建一個AlertDialog.Builder對象
AlertDialog.Builder builder = new AlertDialog.Builder(ctx)
.setMessage(msg).setCancelable(false);
if(closeSelf)
{
builder.setPositiveButton("確定", new OnClickListener()
{
public void onClick(DialogInterface dialog, int which)
{
// 結束當前Activity
((Activity)ctx).finish();
}
});
}
else
{
builder.setPositiveButton("確定", null);
}
builder.create().show();
}
// 定義一個顯示指定組件的對話框
public static void showDialog(Context ctx , View view)
{
AlertDialog.Builder builder = new AlertDialog.Builder(ctx)
.setView(view).setCancelable(false)
.setPositiveButton("確定", null);
builder.create()
.show();
}
}

剩下就是如何與服務器端交互了不多說,代碼如下
復制代碼 代碼如下:

package com.android.up;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.util.List;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.protocol.HTTP;
import org.json.JSONException;
import org.json.JSONObject;
import android.util.Log;
public class JSONParser {
static InputStream is = null;
static JSONObject jObj = null;
static String json = "";
// constructor
public JSONParser() {
}
// function get json from url
// by making HTTP POST
public JSONObject makeHttpRequest(String url, String method,
List<NameValuePair> params) {
// Making HTTP request
try {
// request method is POST
// defaultHttpClient
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(url);
httpPost.setEntity(new UrlEncodedFormEntity(params,HTTP.UTF_8));
HttpResponse httpResponse = httpClient.execute(httpPost);
HttpEntity httpEntity = httpResponse.getEntity();
is = httpEntity.getContent();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(
is, "UTF-8"));
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null) {
sb.append(line + "/n");
}
is.close();
json = sb.toString();
} catch (Exception e) {
Log.e("Buffer Error", "Error converting result " + e.toString());
Log.d("json", json.toString());
}
// try parse the string to a JSON object
try {
jObj = new JSONObject(json);
} catch (JSONException e) {
Log.e("JSON Parser", "Error parsing data " + e.toString());
}
// return JSON String
return jObj;
}
}

到此android客戶端已經完成,后天服務器端用php+mysql實現,當然這里只是個實例,存取到數據庫里面,沒有進行展示,代碼如下
復制代碼 代碼如下:

<?php
// array for JSON response
$response = array();
include("conn.php");
// check for required fields
if (isset($_POST['name']) && isset($_POST['email']) && isset($_POST['description'])) {
$name = $_POST['name'];
$price = $_POST['email'];
$description = $_POST['description'];
$result = mysql_query("INSERT INTO up(name, email, description) VALUES('$name', '$email', '$description')");
echo $result;
// check if row inserted or not
if ($result) {
// successfully inserted into database
$response["success"] = 1;
$response["message"] = "Product successfully created.";
// echoing JSON response
echo json_encode($response);
} else {
// failed to insert row
$response["success"] = 0;
$response["message"] = "Oops! An error occurred.";
// echoing JSON response
echo json_encode($response);
}
} else {
// required field is missing
$response["success"] = 0;
$response["message"] = "Required field(s) is missing";
// echoing JSON response
echo json_encode($response);
}
?>

數據庫表結構如下,連接數據庫代碼就不貼出了,記得把編碼設置為UTF-8就行了。


到此就完成了一個用戶反饋的基本功能,后臺數據里展示。如有問題歡迎給我留言。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美激情免费视频| 精品久久久久久国产| 成人福利视频在线观看| 米奇精品一区二区三区在线观看| 亚洲老板91色精品久久| 日韩中文字幕欧美| 日韩人体视频一二区| 亚洲国产精彩中文乱码av在线播放| 国产成人久久久精品一区| 91免费精品国偷自产在线| 久久偷看各类女兵18女厕嘘嘘| 亚洲成色999久久网站| 亚洲精品videossex少妇| 欧美大胆在线视频| 久久免费精品视频| 欧美日韩亚洲视频一区| 欧美性xxxxxxxxx| 91国产精品视频在线| 亚洲sss综合天堂久久| 国产精品一区二区久久精品| 国产成人精品久久二区二区| 日本高清久久天堂| 欧美激情视频网址| 国产极品jizzhd欧美| 性色av一区二区三区免费| 亚洲人成亚洲人成在线观看| 国产精品久久99久久| 久久久噜噜噜久噜久久| 欧美一区二区三区免费观看| 欧美激情精品久久久久久免费印度| 精品一区二区三区三区| 国产欧亚日韩视频| 欧美又大粗又爽又黄大片视频| 免费不卡在线观看av| 欧美丝袜一区二区| 亚洲a在线观看| 日韩在线观看免费高清完整版| 欧美日韩激情网| 国产亚洲美女精品久久久| 欧美久久精品午夜青青大伊人| 最近更新的2019中文字幕| 日本免费久久高清视频| 亚洲精品久久7777777| 欧美色欧美亚洲高清在线视频| 国产精品96久久久久久又黄又硬| 精品成人久久av| 精品国产欧美一区二区三区成人| 亚洲精品国产拍免费91在线| 国内精品一区二区三区| 欧美激情精品久久久久| 亚洲欧美日韩精品久久奇米色影视| 日韩视频第一页| 97久久精品人人澡人人爽缅北| 欧美精品在线第一页| 911国产网站尤物在线观看| 亚洲男人天堂2024| 欧美精品福利视频| 日韩免费电影在线观看| 在线日韩第一页| 久久激情视频久久| 欧美午夜精品久久久久久浪潮| 亚洲男人的天堂在线播放| 国产成人激情小视频| 欧美日韩亚洲天堂| 亚洲a一级视频| 亚洲xxxx在线| 中文字幕一区二区三区电影| 日韩av手机在线| 中文字幕亚洲欧美日韩在线不卡| 成人黄色网免费| 91精品国产一区| 日日噜噜噜夜夜爽亚洲精品| 欧美激情第1页| 欧美激情免费视频| 国产精品丝袜久久久久久高清| 国产精品三级美女白浆呻吟| 深夜福利亚洲导航| 亚洲欧美激情一区| 色哟哟亚洲精品一区二区| 在线观看国产成人av片| 精品高清一区二区三区| 亚洲成色www8888| 精品国产一区久久久| 欧美一区二区三区艳史| 在线播放国产精品| 亚洲日本中文字幕免费在线不卡| 岛国视频午夜一区免费在线观看| 日韩精品极品毛片系列视频| 91禁外国网站| 国产成人精品午夜| 国产精品女人久久久久久| 91精品国产乱码久久久久久久久| 亚洲在线免费视频| 亚洲精品国精品久久99热| 日韩国产精品亚洲а∨天堂免| 国产欧美日韩精品专区| 91免费国产网站| 亚洲精品欧美一区二区三区| 久久夜色撩人精品| 国内精品久久影院| 精品久久久久久| 69影院欧美专区视频| 国产999精品视频| 日韩中文字幕亚洲| 成人福利免费观看| 日韩激情在线视频| 国产精品第8页| 欧美视频二区36p| 日韩在线视频线视频免费网站| 九九精品视频在线| 日韩精品在线免费| 66m—66摸成人免费视频| 国产精品99免视看9| 91精品国产自产在线| 亚洲综合中文字幕68页| 成人美女免费网站视频| 国产精品影院在线观看| 欧美日韩国产色视频| 91久久久久久久久久| 国产精品国产自产拍高清av水多| 欧美精品久久久久久久久久| 久久成年人免费电影| 国产香蕉精品视频一区二区三区| 亚洲电影免费在线观看| 91亚洲精品久久久久久久久久久久| 亚洲综合精品一区二区| 久久久精品视频成人| 欧美日韩裸体免费视频| 中文字幕亚洲二区| 亚洲欧美日韩中文在线| 国产+人+亚洲| 九色精品免费永久在线| 成人午夜一级二级三级| 久久av中文字幕| 中文字幕精品一区二区精品| 97超级碰碰人国产在线观看| 欧美二区乱c黑人| 亚洲精品影视在线观看| 精品久久久久久久久久久| 欧美精品中文字幕一区| 亚洲欧美激情一区| 亚洲在线观看视频| 日韩最新免费不卡| 欧美日韩国产在线看| 欧美中文字幕在线| 国产亚洲精品久久久久久牛牛| 成人免费网站在线看| 欧美性xxxxxx| 在线电影av不卡网址| 亚洲午夜小视频| 欧美日本中文字幕| 国外成人性视频| 北条麻妃一区二区三区中文字幕| 欧美性xxxx极品高清hd直播| 欧美日韩国产一区中文午夜| 亚洲欧美另类在线观看| 国产999精品| 久热在线中文字幕色999舞| 久久精品在线播放| 亚洲激情久久久| 亚洲自拍中文字幕| 最新中文字幕亚洲| 亚洲国产精品久久91精品| 中文字幕亚洲一区二区三区|