SQLの窓

2017年08月23日


OkHttp を使用した HttpAccess クラスで Web 上の掲示板に投稿(POST)するテンプレート

▼ HttpAccess パッケージのダウンロード


( 解凍して、main\java フォルダの中に コピーして下さい )
※ OkHttp より 最新の Gradle の記述を取得して build.gradle の dependencies の最後に貼り付けて下さい
例) compile 'com.squareup.okhttp3:okhttp:3.8.1'

処理概要

本来ならば、直接JSON を返す PHP 側のアプリを呼び出すのですが、一般的な『掲示板』に実際 Android から POST して、HTML で返される結果はをアプリ内で Log.i() で表示します。但し、この掲示板のデータの保存形式を JSON にしていますので、投稿終了後再度データそのものを呼び出して ListView に表示しています。

掲示板アプリはこのテスト専用に作成したもので、最後の更新後5分でデータが削除されます。投稿と投稿の間には1分の間隔が必要で、固有コードを入力して、そのコード(スレッド)毎に内容を確認できるようにしています




WEB側の実行画面


簡易掲示板(5分限定)

※ このページはレスポンシブです



Android の実行画面



最初のフィールドは固有コードの入力で、自由な数字を入力して次のフィールドで本文を投稿します。そして、投稿後 WEB 側で 固有コードを入力して送信して確認します。

※ 入力された本文は、ListView に表示されます

activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              xmlns:app="http://schemas.android.com/apk/res-auto"
              xmlns:tools="http://schemas.android.com/tools"
              android:id="@+id/layout"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:orientation="vertical"
              tools:context=".MainActivity"
              android:weightSum="1">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <EditText
            android:id="@+id/editTextCode"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:ems="10"
            android:inputType="number"/>

        <Button
            android:id="@+id/button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="Button"/>

    </LinearLayout>

    <EditText
        android:id="@+id/editText"
        android:layout_width="match_parent"
        android:layout_height="113dp"
        android:ems="10"
        android:gravity="top|left"
        android:inputType="textMultiLine"
        />

    <ListView
        android:id="@+id/listView"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</LinearLayout>


MainActivity
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;

import com.example.lightbox.web.HttpAccess;
import com.google.gson.Gson;

import java.util.HashMap;

public class MainActivity extends AppCompatActivity {

	// *******************************
	// データ定義
	// *******************************
	private String url = "https://lightbox.sakura.ne.jp/demo/template/lightbox/bbs-normal/bbs.php";
	private String jsonurl = "https://lightbox.sakura.ne.jp/demo/template/lightbox/bbs-normal/data/";

	// *******************************
	// 変数定義
	// *******************************
	private ArrayAdapter<WebData> arrayAdapter;
	private ListView listView;
	private HttpAccess httpAccess;

	// *******************************
	// 初期処理
	// *******************************
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		// *******************************
		// ボタンのイベント
		// *******************************
		Button button = (Button) MainActivity.this.findViewById(R.id.button);
		button.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {
				Log.i("lightbox", "クリックされました");
				CallPost();
			}
		});

		// *******************************
		// リストビューの準備
		// *******************************
		listView = (ListView) MainActivity.this.findViewById(R.id.listView);
		// データが入るオブジェクト
		arrayAdapter = new ArrayAdapter<WebData>(MainActivity.this, android.R.layout.simple_list_item_1);
		// 初期化
		arrayAdapter.clear();
		// リストビューにデータが入るオブジェクトをセット
		listView.setAdapter(arrayAdapter);

		// *******************************
		// 送信用オブジェクトを作成
		// *******************************
		httpAccess = new HttpAccess(url);

	}

	// *******************************
	// 送信処理
	// *******************************
	private void CallPost() {

		HashMap<String, String> hashMap = new HashMap<String, String>();

		// 投稿テキスト
		EditText editText = (EditText) MainActivity.this.findViewById(R.id.editText);
		String text = editText.getText().toString();
		hashMap.put("text", text);

		// 固有コード
		EditText editTextCode = (EditText) MainActivity.this.findViewById(R.id.editTextCode);
		String code = editTextCode.getText().toString();
		hashMap.put("mycode", code);

		httpAccess.setUrl(url);
		// 送信
		httpAccess.sendPost(hashMap, new HttpAccess.OnAsyncTaskListener() {
			@Override
			public void onAsyncTaskListener(String s) {
				Log.i("lightbox", s);

				// 固有コード
				EditText editTextCode = (EditText) MainActivity.this.findViewById(R.id.editTextCode);
				String code = editTextCode.getText().toString();

				// *******************************
				// 投稿(POST) 後、結果の JSON を取得する
				// *******************************
				httpAccess.setUrl(String.format("%s%s.json",jsonurl,code));
				httpAccess.sendGet(new HttpAccess.OnAsyncTaskListener() {
					@Override
					public void onAsyncTaskListener(String s) {
						Log.i("lightbox", s);

						// *******************************
						// JSON を ListView に表示する
						// *******************************
						Gson gson = new Gson();
						DataList dataList = gson.fromJson(s,DataList.class);
						// クリア
						arrayAdapter.clear();
						// データセット
						arrayAdapter.addAll(dataList.item);

					}
				});


			}
		});

	}

}



Google Gson 用のデータ格納用のクラス
package com.example.lightbox.posttest;

public class DataList {

	WebData[] item;

}

package com.example.lightbox.posttest;

public class WebData {

	String text;

	@Override
	public String toString() {
		return text;
	}
}




build.gradle( dependencies ) に追加する2行
compile 'com.google.code.gson:gson:2.8.1'
compile 'com.squareup.okhttp3:okhttp:3.8.1'


※ android.permission.INTERNET が必要です
※ コピーして使いやすいように、ソースコードにパッケージに依存する記述が無いので注意して下さい。
(画面は、.MainActivity なのでそのまま使用可能です)





【2017 Android Studioの最新記事】
posted by lightbox at 2017-08-23 20:17 | 2017 Android Studio | このブログの読者になる | 更新情報をチェックする
container 終わり



フリーフォントで簡単ロゴ作成
フリーフォントでボタン素材作成
フリーフォントで吹き出し画像作成
フリーフォントではんこ画像作成
ほぼ自由に利用できるフリーフォント
フリーフォントの書体見本とサンプル
画像を大きく見る為のウインドウを開くボタンの作成

CSS ドロップシャドウの参考デモ
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり