1-3. PHP+MySQL のサンプル: PDO を使用した簡単なデータ編集の Web アプリ
で作成した Web ページの検索部分を Android アプリで作成します。
サーバー側プログラムは上記で作成した PHP をそのまま利用します。
ソースはこちらで公開しています。
https://github.com/matsushima-terunao/android_test
前項で作成したプロジェクトに UI 部品を追加し、画面を作成していきます。
画面に部品を追加するには、左側の Palette から部品を選択し、右側の画面または Outline にドロップします。
また、テキストやボタンなどの画面に表示する部品は Layout というレイアウト用の部品の子供でなければいけません。
ここではまず、LinearLayout (Vertical) という、部品を縦に並べるレイアウト部品を配置します。
Palette の Layouts をクリックして広げる。
LinearLayout (Vertical) を右側の画面にドラッグ&ドロップする。
さらにテキスト表示の部品を追加します。
Palette の Form Widgets をクリックして広げる。
Large を右側の画面の先ほど追加した Layout にドラッグ&ドロップする。
追加したテキストをクリックし、右側の Properties -> Text でテキストを変更する。
同様に、テキスト入力、レイアウト、ボタン、リストの部品を追加してきます。
MainActivity.java を開き、コードを追加していきます。
通信を行う場合、AndroidManifest.xml の manifest 開始タグ直後に以下を追加
onCreate() の // 検索ボタン の後に、検索ボタンが押されたときのリスナーを追加します。
search() 内に検索処理を実装します。
通信処理は UI とは別のスレッドにしなければいけません。そのため、AsyncTask の派生クラス内で実装します。
doInBackground() は別スレッドで実行されます。この中で通信処理を実行します。
onPostExecute() は doInBackground() 実行後に UI スレッドで実行されます。この中で結果 HTML を解析し、ListView に結果を格納します。
→ 1-3. Android で OpenGL
← 1-1. Android アプリ開発
↑ 一覧
で作成した Web ページの検索部分を Android アプリで作成します。
サーバー側プログラムは上記で作成した PHP をそのまま利用します。
ソースはこちらで公開しています。
https://github.com/matsushima-terunao/android_test
画面作成
前項で作成したプロジェクトに UI 部品を追加し、画面を作成していきます。
画面に部品を追加するには、左側の Palette から部品を選択し、右側の画面または Outline にドロップします。
また、テキストやボタンなどの画面に表示する部品は Layout というレイアウト用の部品の子供でなければいけません。
ここではまず、LinearLayout (Vertical) という、部品を縦に並べるレイアウト部品を配置します。
Palette の Layouts をクリックして広げる。
LinearLayout (Vertical) を右側の画面にドラッグ&ドロップする。
さらにテキスト表示の部品を追加します。
Palette の Form Widgets をクリックして広げる。
Large を右側の画面の先ほど追加した Layout にドラッグ&ドロップする。
追加したテキストをクリックし、右側の Properties -> Text でテキストを変更する。
同様に、テキスト入力、レイアウト、ボタン、リストの部品を追加してきます。
コードの作成
MainActivity.java を開き、コードを追加していきます。
package com.example.sample;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;
public class MainActivity extends ActionBarActivity {
private static final String URL = "http://192.168.1.24/member.php?";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
((TextView)findViewById(R.id.textView2)).setText("");
// 検索ボタン
((Button)findViewById(R.id.button1)).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
((TextView)findViewById(R.id.textView2)).setText("検索中...");
search(((TextView)findViewById(R.id.editText1)).getText().toString());
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
/**
* 検索。
*
* @return
*/
private void search(String keyword) {
final MainActivity activity = this;
/**
* 非同期処理クラス。
*/
AsyncTask<String, Void, String> task = new AsyncTask<String, Void, String>() {
/**
* バックグラウンドスレッドで実行。
*/
@Override
protected String doInBackground(String... params) {
try {
HttpGet http = new HttpGet(URL + "keyword=" + params[0]);
DefaultHttpClient client = new DefaultHttpClient();
HttpResponse response = client.execute(http);
int status = response.getStatusLine().getStatusCode();
if (HttpStatus.SC_OK != status) {
throw new Exception("!ok");
}
return EntityUtils.toString(response.getEntity(), "UTF-8");
} catch (Exception e) {
return e.toString();
}
}
/**
* doInBackground() 実行後に UI スレッドを実行。
*/
@Override
protected void onPostExecute(String result) {
ArrayAdapter<String> adapter = new ArrayAdapter<String>(
activity, android.R.layout.simple_list_item_1);
int count = 0;
Pattern p = Pattern.compile(
"(?is)<tr>.*?<td>(.*?)</td>.*?<td><a .*?>(.*?)</a></td>.*?<td>(.*?)</td>.*?</tr>");
Matcher m = p.matcher(result);
while (m.find()) {
++ count;
adapter.add(m.group(1) + " " + m.group(2) + " " + m.group(3));
}
((TextView)findViewById(R.id.textView2)).setText(count + " 件見つかりました");
((ListView)findViewById(R.id.listView1)).setAdapter(adapter);
}
};
// 非同期処理を実行
task.execute(keyword);
}
}
通信を行う場合、AndroidManifest.xml の manifest 開始タグ直後に以下を追加
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
onCreate() の // 検索ボタン の後に、検索ボタンが押されたときのリスナーを追加します。
search() 内に検索処理を実装します。
通信処理は UI とは別のスレッドにしなければいけません。そのため、AsyncTask の派生クラス内で実装します。
doInBackground() は別スレッドで実行されます。この中で通信処理を実行します。
onPostExecute() は doInBackground() 実行後に UI スレッドで実行されます。この中で結果 HTML を解析し、ListView に結果を格納します。
→ 1-3. Android で OpenGL
← 1-1. Android アプリ開発
↑ 一覧
0 件のコメント:
コメントを投稿