Ich habe versucht, meine App durch Tippen auf das Widget für Wochen zu öffnen, aber nichts scheint zu funktionieren. Ich denke, dass etwas an meinem Code meine Situation von etwas unterscheidet. Mein Widget ist nur eine Liste mit Aufgaben. Ich werde nur ganze Klassen veröffentlichen, damit die Leute sehen können, was vor sich geht.Tippen Sie auf Widget, um App zu öffnen
Könnte jemand bitte mir dabei helfen?
ListProvider:
public class ListProvider implements RemoteViewsService.RemoteViewsFactory {
private ArrayList<ListObject> listObjectList = new ArrayList<ListObject>();
private Context context = null;
private TinyDB tinyDB;
private ArrayList<Integer> checkedPositions = new ArrayList<>();
public ListProvider(Context context, Intent intent) {
this.context = context;
populateWidget();
}
private void populateWidget() {
if(MainActivity.user != null) {
checkedPositions.clear();
for(int i = 0; i < MainActivity.user.getTaskLists().size(); i++){
TaskList taskList = MainActivity.user.getTaskLists().get(i);
listObjectList.add(new ListTitle(taskList.getName()));
for (int j = 0; j < taskList.getTasks().size(); j++) {
ListItem listItem = new ListItem();
listItem.text = taskList.getTasks().get(j).getTitle();
listObjectList.add(listItem);
if(taskList.getTasks().get(j).isChecked()){
//if task is checked, add to checked list
checkedPositions.add(listObjectList.size() - 1);
}
}
listObjectList.add(new ListItem(" "));
}
}else{
loadLastSavedList();
}
}
@Override
public int getCount() {
return listObjectList.size();
}
@Override
public long getItemId(int position) {
return position;
}
/*
*Similar to getView of Adapter where instead of View
*we return RemoteViews
*
*/
@Override
public RemoteViews getViewAt(int position) {
RemoteViews remoteView = new RemoteViews(
context.getPackageName(), R.layout.widget_list_item);
ListObject listObject = listObjectList.get(position);
//get whether item is a item or title
if(listObject.getClass().equals(ListItem.class)) {
//list item
ListItem listItem = (ListItem) listObject;
remoteView.setTextViewText(R.id.title, "");
remoteView.setTextViewText(R.id.text, listItem.text);
}else{
//list title
ListTitle listTitle = (ListTitle) listObject;
remoteView.setTextViewText(R.id.text, "");
remoteView.setTextViewText(R.id.title, listTitle.title);
}
//text size
SharedPreferences SP = PreferenceManager.getDefaultSharedPreferences(context.getApplicationContext());
String textSize = SP.getString(context.getString(R.string.widget_pref_key_text_size), context.getString(R.string.medium));
System.out.println(textSize);
if (textSize.equals(context.getString(R.string.small))) {
//small
remoteView.setTextViewTextSize(R.id.text, TypedValue.COMPLEX_UNIT_SP, 14);
remoteView.setTextViewTextSize(R.id.title, TypedValue.COMPLEX_UNIT_SP, 16);
} else if (textSize.equals(context.getString(R.string.large))) {
//large
remoteView.setTextViewTextSize(R.id.text, TypedValue.COMPLEX_UNIT_SP, 22);
remoteView.setTextViewTextSize(R.id.title, TypedValue.COMPLEX_UNIT_SP, 24);
} else {
//medium, default
remoteView.setTextViewTextSize(R.id.text, TypedValue.COMPLEX_UNIT_SP, 18);
remoteView.setTextViewTextSize(R.id.title, TypedValue.COMPLEX_UNIT_SP, 20);
}
//strikethrough if checked
if(checkedPositions.contains(position)){
remoteView.setInt(R.id.text, "setPaintFlags", Paint.STRIKE_THRU_TEXT_FLAG | Paint.ANTI_ALIAS_FLAG);
}else{
remoteView.setInt(R.id.text, "setPaintFlags", (~ Paint.STRIKE_THRU_TEXT_FLAG) & Paint.ANTI_ALIAS_FLAG);
}
return remoteView;
}
@Override
public RemoteViews getLoadingView() {
return null;
}
@Override
public int getViewTypeCount() {
return 1;
}
@Override
public boolean hasStableIds() {
return false;
}
@Override
public void onCreate() {
loadLastSavedList();
}
private void loadLastSavedList() {
//load up saved items
tinyDB = new TinyDB(context);
ArrayList<String> strings = tinyDB.getListString(context.getString(R.string.saved_key));
System.out.println(strings.size());
//full up listItems
for(int i = 0; i < strings.size(); i++) {
if(i == 0){
//first object, title
listObjectList.add(new ListTitle(strings.get(i)));
}else if(strings.get(i - 1).equals(" ")){
//title
listObjectList.add(new ListTitle(strings.get(i)));
}else{
//list item
listObjectList.add(new ListItem(strings.get(i)));
}
}
}
@Override
public void onDataSetChanged() {
listObjectList.clear();
populateWidget();
//save list items
ArrayList<String> strings = new ArrayList<>();
for(ListObject listObject: listObjectList){
if(listObject.getClass().equals(ListItem.class)) {
//list item
ListItem listItem = (ListItem) listObject;
strings.add(listItem.text);
}else{
//list title
ListTitle listTitle = (ListTitle) listObject;
strings.add(listTitle.title);
}
}
tinyDB = new TinyDB(context);
tinyDB.putListString(context.getString(R.string.saved_key), strings);
}
@Override
public void onDestroy() {
}
}
WidgetProvider:
public class WidgetProvider extends AppWidgetProvider {
/**
* this method is called every 30 mins as specified on widgetinfo.xml
* this method is also called on every phone reboot
**/
@Override
public void onUpdate(Context context, AppWidgetManager
appWidgetManager, int[] appWidgetIds) {
/*int[] appWidgetIds holds ids of multiple instance
* of your widget
* meaning you are placing more than one widgets on
* your homescreen*/
final int N = appWidgetIds.length;
for (int i = 0; i < N; i++) {
RemoteViews remoteViews = updateWidgetListView(context,
appWidgetIds[i]);
appWidgetManager.updateAppWidget(appWidgetIds[i],
remoteViews);
}
super.onUpdate(context, appWidgetManager, appWidgetIds);
}
private RemoteViews updateWidgetListView(Context context,
int appWidgetId) {
//which layout to show on widget
RemoteViews remoteViews = new RemoteViews(
context.getPackageName(), R.layout.widget_layout);
//RemoteViews Service needed to provide adapter for ListView
Intent svcIntent = new Intent(context, WidgetService.class);
//passing app widget id to that RemoteViews Service
svcIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
//setting a unique Uri to the intent
//don't know its purpose to me right now
svcIntent.setData(Uri.parse(
svcIntent.toUri(Intent.URI_INTENT_SCHEME)));
//setting adapter to listview of the widget
remoteViews.setRemoteAdapter(appWidgetId, R.id.listViewWidget,
svcIntent);
//setting an empty view in case of no data
remoteViews.setEmptyView(R.id.listViewWidget, R.id.empty_view);
return remoteViews;
}
}
Vielen Dank im Voraus!
Dies funktioniert, aber ich möchte es so, wenn Sie irgendwo auf das Widget drücken, wird es geöffnet. Dies macht es so, dass Sie auf einen Listenpunkt drücken müssen. – Jared
@Jared: AFAIK, wenn Sie eine "ListView" in einem App-Widget präsentieren, wird der Benutzer erwarten, dass durch Tippen auf ein Listenelement etwas spezifisch für dieses Listenelement angezeigt wird. In Ihrem Fall würde es eine Aktivität mit Details der Aufgabe anzeigen, auf die der Benutzer geklickt hat. Denn so funktionieren Scroll-Listen überall sonst in Android: Klicken Sie auf einen Gegenstand und es passiert etwas, das für den jeweiligen Gegenstand relevant ist. Nachdem dies gesagt wurde, können Sie versuchen, 'setOnClickPendingIntent()' auf den 'RemoteViews' aufzurufen und die ID der' ListView' zu übergeben. – CommonsWare