안녕하세요.
무작정 안드로이드 어플 하나 만들겠다고 시작했는데,, 몇일의 구글링도 무색하게 문제 해결이 안되네요 ㅜㅜ
구현하고자 하는것은
db에서 받은 데이터를 홈 위젯의 textview에 뿌리는 것만 하면 되는거구요
홈위젯 textview옆의 화살표 버튼을 누르면 db에 있는 테이블에서 현재 row 다음에 있는 데이터를 또 textview에 뿌리면 됩니다.
public void onReceive(Context context, Intent intent) {
super.onReceive(context, intent);
String action = intent.getAction();
if (action.equals(ACTION_GO)) {
where ++;
mOpenHelper = new DatabaseHelper(context);
SQLiteDatabase db = mOpenHelper.getWritableDatabase();
Cursor cursor;
cursor = db.query(DATABASE_TABLE, null, null, null, null, null,
null);
if(where>=cursor.getCount())
{
where = 1;
}
cursor.moveToPosition(where);
그런데 문제는 ㅜㅜ 이 다음값을 뿌리는게 한번만 되고 그 이상 되지 않아요....
widget을 구현하는 클래스 에서 전역변수로 public int where = 1;을 선언했구요
public class Widget extends AppWidgetProvider {
public int where = 1;
이렇게요
오버라이딩한 onReceive로 호출될때마다 where 값이 1씩 증가해서
테이블에서 버튼 누른수 만큼 증가한 포지션의 값을 꺼내오려고 하는데
디버깅 결과 자꾸 where 값이 onReceive들어오면 1로 되서 결과값이 2에서 바뀌지를 않네요
안드로이드도, 자바도 아직 완벽하게 이해하지 않은 상태에서 하려고 하니 정말 머리가 아풉니다 ㅜㅜ
왜 안되는지 알려주시면,, 정말 감사드려요 ㅜㅜ
답변 정말 감사드립니다 ㅠㅠ 눈물 줄줄
@대왕초보: 현재 테이블에 입력된 갯수가 8개여서 그 if문 안의 조건은 크게의미가 없는것 같아요 문제는 onReceive로 들어오면 where값이 계속 1로 초기화 된다는거에요 ㅜㅜ
@탈공: 헉 ㅋㅋ 대단하세요,
AppWidgetProvider의 성격을 제가 잘 몰라서 그러는 거일 수 도 있는것 같습니다만
의도적으로 new를 시키거나 그런 부분은 없거든요 ㅜㅜ 소스 전부 첨부해볼게요
만약에 getter와 setter를 설정하면 어디다가 해야 할지, 힌트 조금만 주시면 감사하겠습니다!
두분 답변 정말 감사드려요
package com.indky.wordroidwidget;
import android.app.PendingIntent;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.widget.RemoteViews;
public class Widget extends AppWidgetProvider {
public static final String ACTION_GO = "com.indky.wordroidwidget.GO";
public static final String ACTION_BACK = "com.indky.wordroidwidget.BACK";
public static final String ACTION_RANDOM = "com.indky.wordroidwidget.RANDOM";
private static String DATABASE_TABLE = "word_table";
public DatabaseHelper mOpenHelper;
// 여기다 int값을 설정했구요!!
int where;
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
int[] appWidgetIds) {
final int N = appWidgetIds.length;
for (int i = 0; i < N; i++) {
int appWidgetId = appWidgetIds[i];
RemoteViews views = buildViews(context);
appWidgetManager.updateAppWidget(appWidgetId, views);
}
}
@Override
public void onReceive(Context context, Intent intent) {
super.onReceive(context, intent);
String action = intent.getAction();
mOpenHelper = new DatabaseHelper(context);
SQLiteDatabase db = mOpenHelper.getWritableDatabase();
Cursor cursor;
cursor = db.query(DATABASE_TABLE, null, null, null, null, null,
null);
// 여기서 버튼 go가 눌렸을때!!
if (action.equals(ACTION_GO)) {
where값이 증가해서
where = where +1;
//이건 테이블의 row수를 넘지 않게 하려는 조건이구요
if(where>=cursor.getCount()){
where = 1;
}
증가한 where수 만큼 (버튼을 누른 만큼) 에 해당하는 row의 데이터를 가져온다!
cursor.moveToPosition(where);
}
if (action.equals(ACTION_BACK)) {
where = where -1;
if(where <= 0){
where = cursor.getCount()-1;
}
cursor.moveToPosition(where);
}
cursor.moveToPosition(7);
String Mean = cursor.getString(1);
String Spell = cursor.getString(2);
String Full = Mean + '\n' + Spell;
cursor.close();
AppWidgetManager appWidgetManager = AppWidgetManager
.getInstance(context);
RemoteViews views = new RemoteViews(context.getPackageName(),
R.layout.widget_layout);
views.setTextViewText(R.id.openMyPreference, Full);
ComponentName cpName = new ComponentName(context, Widget.class);
appWidgetManager.updateAppWidget(cpName, views);
}
private PendingIntent buildActivityIntent(Context context) {
Intent intent = new Intent(context, MyPreference.class);
PendingIntent pi = PendingIntent.getActivity(context, 0, intent,
Intent.FLAG_ACTIVITY_NEW_TASK);
return pi;
}
private PendingIntent go(Context context) {
Intent intent = new Intent(ACTION_GO);
PendingIntent pi = PendingIntent.getBroadcast(context, 0, intent,
PendingIntent.FLAG_UPDATE_CURRENT);
return pi;
}
private PendingIntent back(Context context) {
Intent intent = new Intent(ACTION_BACK);
PendingIntent pi = PendingIntent.getBroadcast(context, 0, intent,
PendingIntent.FLAG_UPDATE_CURRENT);
return pi;
}
private PendingIntent random(Context context) {
Intent intent = new Intent(ACTION_RANDOM);
PendingIntent pi = PendingIntent.getBroadcast(context, 0, intent,
PendingIntent.FLAG_UPDATE_CURRENT);
return pi;
}
private RemoteViews buildViews(Context context) {
RemoteViews views = new RemoteViews(context.getPackageName(),
R.layout.widget_layout);
views.setOnClickPendingIntent(R.id.openMyPreference,
buildActivityIntent(context));
views.setOnClickPendingIntent(R.id.go, go(context));
views.setOnClickPendingIntent(R.id.back, back(context));
views.setOnClickPendingIntent(R.id.random, random(context));
mOpenHelper = new DatabaseHelper(context);
SQLiteDatabase db = mOpenHelper.getWritableDatabase();
Cursor cursor;
cursor = db.query(DATABASE_TABLE, null, null, null, null, null,
null);
cursor.moveToFirst();
String Mean = cursor.getString(1);
String Spell = cursor.getString(2);
String Full = Mean + '\n' + Spell;
cursor.close();
views.setTextViewText(R.id.openMyPreference, Full);
//views.setTextViewText(R.id.openMyPreference, "단어장을 선택해 주세요");
return views;
}
}




질문명이 차마 지나갈 수 없는 내용이라 글남깁니다. 저도 자바 모르고 안드로이드 개발에 뛰어들었거든요.(심지어 전산종류과도 아닙니다.)
스윽 읽어봤는데 아마 public int where = 1; 이놈이 호출될때마다 초기화 된다는 말씀을 보면 where 값을 증가시킬때가 문제가 아닌가 조심스레 추측해봅니다. 혹시 where 값을 변경하는 화살표를 클릭할때 AppWidgetProvider 클래스를 계속 new시키고 계시는건 아닌지요? 그렇다면 전역변수가 클래스 호출때마다 1로 초기화되기 때문에 현재와 같은 문제가 발생할 가능성도 있습니다. 이런경우 new 대신 셋터를 만드셔서 갱신하시면 해결될거에요.
엉터리라고 웃고계시는분. 그렇다면 아래에 답글을 달아주세요 ㅋㅋ