手順5、タイトルをクリックしたり画像をクリックしたらナニガシする
そうだな、タイトル文字をクリックしたら該当の記事の itemId がトーストされるようにしてみよう。
かつ、アイコン画像をクリックしたら該当の記事の itemTitle がトーストされるようにしてみよう。
ループ処理の中で該当のIDが取得出来るかどうか、新しい処理を起動出来るかどうか??
以下HogehogeActivity.javaの修正箇所を赤文字で記載しました。
package jp.example.hello;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import org.json.JSONArray;
import org.json.JSONObject;
import android.app.Activity;
import android.app.ProgressDialog;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
public class HogehogeActivity extends Activity {
private static final String LogTag = “HogehogeLog”;
private ProgressDialog dialog;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.hogehoge);
// jsonを取得して解析する
LoadTask();
}
private String makeApiUrl(){
return “http://akamako.com/blogger/sample.php”;
}
private void LoadTask(){
// ProgressDialogを作成
dialog = new ProgressDialog(this);
dialog.setMessage(“Connect to Server.”);
dialog.setCancelable(true);
dialog.show();
try{
String apiUrl = makeApiUrl();
// コンソールログに出力
Log.d(LogTag+” apiUrl”,apiUrl);
HttpGet get = new HttpGet(apiUrl);
HttpClient DefaultHttpClient = new DefaultHttpClient();
HttpResponse response = DefaultHttpClient.execute(get);
// ステータスコード
int status = response.getStatusLine().getStatusCode();
Log.d(LogTag+” status”,String.valueOf(status));
if (status != HttpStatus.SC_OK) {
throw new Exception(“Error!”);
}
// 結果を取得
String source = EntityUtils.toString(response.getEntity());
Log.d(LogTag+” source”,source);
// JSONObject という型があるんだって
JSONObject json = new JSONObject(source);
if (json.get(“items”) == JSONObject.NULL){
throw new Exception(“Error!”);
}
if (json.get(“count”) == JSONObject.NULL){
throw new Exception(“Error!”);
}
// 記事データ
JSONArray items = json.getJSONArray(“items”);
// 記事の数
String count = json.getString(“count”);
if(count.equals(“0”) == true){
// 記事データが無かったお
}
// items の中身の数
int maxI = items.length();
LinearLayout layout = (LinearLayout) findViewById(R.id.hogehoge_layout);
// URL aURL;
// URLConnection conn;
// InputStream is;
// BufferedInputStream bis;
// Bitmap bm;
for(int i = 0; i < maxI; i++) {
// 1つ取り出す
JSONObject item = items.getJSONObject(i);
// 表示項目を初期化
String itemId = “”;
String itemTitle=“”;
String itemDetail=“”;
String itemIconUrl=“”;
String itemImageUrl=“”;
if(item.has(“id”)) {
itemId = item.getString(“id”);
}
if(item.has(“title”)) {
itemTitle = item.getString(“title”);
}
if(item.has(“detail”)) {
itemDetail = item.getString(“detail”);
}
if(item.has(“icon”)) {
itemIconUrl = item.getString(“icon”);
}
if(item.has(“image”)) {
itemImageUrl = item.getString(“image”);
}
Log.d(LogTag + ” itemId”, itemId);
Log.d(LogTag + ” itemTitle”, itemTitle);
Log.d(LogTag + ” itemDetail”, itemDetail);
Log.d(LogTag + ” itemIconUrl”, itemIconUrl);
Log.d(LogTag + ” itemImageUrl”, itemImageUrl);
// layout/hogehoge_list.xml が1記事のテンプレートです
View view = getLayoutInflater().inflate(R.layout.hogehoge_sub, null);
layout.addView(view);
// 各表示項目のスキーマ(?)を取り出す
TextView itemId_v = (TextView) view.findViewById(R.id.itemId);
TextView itemTitle_v = (TextView) view.findViewById(R.id.itemTitle);
TextView itemDetail_v = (TextView) view.findViewById(R.id.itemDetail);
// TextView itemIcon_v = (TextView) view.findViewById(R.id.itemIcon);
// TextView itemImage_v = (TextView) view.findViewById(R.id.itemImage);
ImageView itemIcon_v = (ImageView) view.findViewById(R.id.itemIcon);
ImageView itemImage_v = (ImageView) view.findViewById(R.id.itemImage);
// 該当の表示個所に当て込む
itemId_v.setText(itemId);
itemTitle_v.setText(itemTitle);
itemDetail_v.setText(itemDetail);
// itemIcon_v.setText(itemIconUrl);
// itemImage_v.setText(itemImageUrl);
// aURL = new URL(itemIconUrl);
// conn = aURL.openConnection();
// conn.connect();
// is = conn.getInputStream();
// bis = new BufferedInputStream(is);
// bm = BitmapFactory.decodeStream(bis);
// bis.close();
// is.close();
// itemIcon_v.setImageBitmap(bm);
//
// aURL = new URL(itemImageUrl);
// conn = aURL.openConnection();
// conn.connect();
// is = conn.getInputStream();
// bis = new BufferedInputStream(is);
// bm = BitmapFactory.decodeStream(bis);
// bis.close();
// is.close();
// itemImage_v.setImageBitmap(bm);
new LoadImageTask(itemIcon_v).execute(itemIconUrl);
new LoadImageTask(itemImage_v).execute(itemImageUrl);
// クリックしたときにitemTitleClickListener()を実行する
itemTitle_v.setClickable(true);
itemTitle_v.setOnClickListener(itemTitleClickListener(itemId));
// itemTitleをクリックしたときにitemTitleClickListener()を実行する
itemIcon_v.setClickable(true);
itemIcon_v.setOnClickListener(itemIconClickListener(itemIconUrl));
}
// 接続を解除する
DefaultHttpClient.getConnectionManager().shutdown();
}
catch (ClientProtocolException e){
Log.d(LogTag + ” ClientProtocolException”, e.getMessage());
}
catch (IOException e){
Log.d(LogTag + ” IOException”, e.getMessage());
}
catch(Exception e){
Log.d(LogTag + ” Exception”, e.getMessage());
}
if (dialog != null && dialog.isShowing()) {
dialog.dismiss();
}
}
// クリック時に呼ばれる
private View.OnClickListener itemTitleClickListener(final String itemId){
return new View.OnClickListener() {
@Override
public void onClick(View view){
Toast.makeText(getApplicationContext(),“itemId =” + itemId ,Toast.LENGTH_SHORT).show();
}
};
}
// クリック時に呼ばれる
private View.OnClickListener itemIconClickListener(final String string){
return new View.OnClickListener() {
@Override
public void onClick(View view){
Toast.makeText(getApplicationContext(),“url =” + string ,Toast.LENGTH_SHORT).show();
}
};
}
public class LoadImageTask extends AsyncTask<String, Void, Bitmap> {
// アイコンを表示するビュー
private ImageView imageView;
// コンストラクタ
public LoadImageTask(ImageView imageView) {
this.imageView = imageView;
}
// バックグラウンドで行う時間のかかる処理をします。
@Override
protected Bitmap doInBackground(String… urls) {
Bitmap img = null;
try {
Log.d(LogTag+” loadImageTask url : “,urls[0]);
URL imageUrl = new URL(urls[0]);
HttpURLConnection itemIconCon = (HttpURLConnection)(imageUrl).openConnection();
InputStream is = itemIconCon.getInputStream();
img = BitmapFactory.decodeStream(is);
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return img;
}
// doInBackgroundメソッドの処理終了後、UIスレッドに返します
@Override
protected void onPostExecute(Bitmap result) {
// キャンセルされていたらなにもしない
if (isCancelled()) {
result = null;
}
if (result != null) {
if (imageView != null) {
imageView.setImageBitmap(result);
}
}
}
}
}
クリック動作を判別してくれる View.OnClickListener というインターフェース を利用したのです。
itemTitle_v.setClickable(true); でクッリックできるようにしてあげます。
itemTitle_v.setOnClickListener(itemTitleClickListener(itemId)); でクリックしたときにitemTitleClickListener()が実行されます。
関数の記述が我々PHP WEBエンジニアにとっては謎です。
private View.OnClickListener itemTitleClickListener(final String itemId)
View.OnClickListener はreturnされるオブジェクトの型ですね。
引数の final String itemId って部分は、何でfinalなんだろうかねえ。ループ処理内で利用されているから?わからないです。
・動作確認
まずはタイトルをくりっくしてみると、、
ループ処理内での itemId が表示されました。
今度はアイコン画像をクリックしてみると、、
該当の記事がトーストされたー!やたー!
コメントを残す