独自の Android ウィジェットを作成しようとしています。オンラインデータベースから非同期タスクからデータを取得するリストビューを含めたいです。
これまでのところ、 res/xml.stat_widget.xml があります
<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider
xmlns:android="http://schemas.android.com/apk/res/android"
android:minWidth="220dp"
android:minHeight="72dp"
android:updatePeriodMillis="86400000"
android:initialLayout="@layout/widget_stat_view">
</appwidget-provider>
およびレイアウト widget_stat_view:
<?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" >
<TextView
android:id="@+id/statisticsTitle"
android:gravity="center"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:ems="10"
android:text="Your Statistics"
android:textSize="20sp"
android:textStyle = "bold"
android:padding="5dip"
>
</TextView>
<View
android:layout_width="1dp"
android:layout_height="30dp">
</View>
<ListView
android:id="@+id/yourStats"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:dividerHeight="0px"
android:divider="@null"
>
</ListView>
</LinearLayout>
非同期タスクを呼び出すウィジェット プロバイダーをコーディングしようとしています。通常のアプリ アクティビティで使用する非同期タスクをモデルにして、非同期タスクを作成しました。ウィジェットのデータを変更するようにまだ設定されていませんが、プロバイダーからの呼び出しに問題があります。
package com.example.beerportfoliopro;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.Context;
import android.content.SharedPreferences;
import android.preference.PreferenceManager;
import android.util.Log;
import android.widget.RemoteViews;
import com.beerportfolio.beerportfoliopro.R;
/**
* Created by Mike on 9/12/13.
*/
public class StatWidgetProvider extends AppWidgetProvider {
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
int[] appWidgetIds) {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
String userName = prefs.getString("userName", null);
String userID = prefs.getString("userID", null);
String url = "myURL";
new GetJSONStatWidget(this).execute(url);
}
public static void updateWidgetContent(Context context,
AppWidgetManager appWidgetManager) {
RemoteViews remoteView = new RemoteViews(context.getPackageName(),
R.layout.widget_stat_view);
remoteView.setTextViewText(R.id.title, strLatestTitle);
Intent launchAppIntent = new Intent(context, TutListActivity.class);
PendingIntent launchAppPendingIntent = PendingIntent.getActivity(context,
0, launchAppIntent, PendingIntent.FLAG_UPDATE_CURRENT);
remoteView.setOnClickPendingIntent(R.id.full_widget, launchAppPendingIntent);
ComponentName tutListWidget = new ComponentName(context,
TutWidgetProvider.class);
appWidgetManager.updateAppWidget(tutListWidget, remoteView);
}
}
上記のコードのこの行で最初に発生するエラー:
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
エラーは次のとおりです。
getDefaultSharedPreferences
(android.content.Context)
in PreferenceManager cannot be applied
to
(com.example.beerportfoliopro.StatWidgetProvider)
次の行でもエラーが発生します。
new GetJSONStatWidget(this).execute(url);
私の非同期タスクコードはこれです:
package com.example.beerportfoliopro;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.zip.Inflater;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.StatusLine;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONObject;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.AsyncTask;
import android.preference.PreferenceManager;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.RatingBar;
import android.widget.RatingBar.OnRatingBarChangeListener;
import android.widget.TextView;
import android.widget.Toast;
import com.beerportfolio.beerportfoliopro.R;
public class GetJSONStatWidget extends AsyncTask
<String, Void, String> {
Context c;
String b;
public GetJSONStatWidget(Context context)
{
c = context;
}
@Override
protected String doInBackground(String... arg0) {
// TODO Auto-generated method stub
return readJSONFeed(arg0[0]);
}
protected void onPostExecute(String result){
//decode json here
try{
JSONObject json = new JSONObject(result);
String beerCount = json.getString("beerCount");
String breweryCount = json.getString("breweryCount");
String styleCount = json.getString("styleCount");
String highABV = json.getString("highABV");
String highIBU = json.getString("highIBU");
//todo: everything below is for the listview
//make array list for stats
final List<BasicStat> basicStatList = new ArrayList<BasicStat>();
//create object
BasicStat stat1 = new BasicStat("Beer Count: ", beerCount);
basicStatList.add(stat1);
BasicStat stat2 = new BasicStat("Brewery Count: ", breweryCount);
basicStatList.add(stat2);
BasicStat stat3 = new BasicStat("Style Count: ", styleCount);
basicStatList.add(stat3);
BasicStat stat4 = new BasicStat("High ABV: ", highABV);
basicStatList.add(stat4);
BasicStat stat5 = new BasicStat("High IBU: ", highIBU);
basicStatList.add(stat5);
//acces listview
ListView lv = (ListView) ((Activity) c).findViewById(R.id.yourStats);
//add items to listview
StatInfoAdapter adapter1 = new StatInfoAdapter(c ,R.layout.stat_list_item, basicStatList);
lv.setAdapter(adapter1);
}
catch(Exception e){
}
}
public String readJSONFeed(String URL) {
StringBuilder stringBuilder = new StringBuilder();
HttpClient httpClient = new DefaultHttpClient();
HttpGet httpGet = new HttpGet(URL);
try {
HttpResponse response = httpClient.execute(httpGet);
StatusLine statusLine = response.getStatusLine();
int statusCode = statusLine.getStatusCode();
if (statusCode == 200) {
HttpEntity entity = response.getEntity();
InputStream inputStream = entity.getContent();
BufferedReader reader = new BufferedReader(
new InputStreamReader(inputStream));
String line;
while ((line = reader.readLine()) != null) {
stringBuilder.append(line);
}
inputStream.close();
} else {
Log.d("JSON", "Failed to download file");
}
} catch (Exception e) {
Log.d("readJSONFeed", e.getLocalizedMessage());
}
return stringBuilder.toString();
}
}