Visualizzazione stampabile
-
Problema Widget
Salve ragazzi,
ho un problema con il setOnClickPendingIntent() del widget.
Praticamente accade che, dopo la creazione del widget, quando ci vado a cliccare sopra NON SUCCEDE NULLA. Neanche una riga sul logcat...assolutamente nulla...
Praticamente è come se non ci avessi mai cliccato....Poi la cosa strana è che, quando reinstallo l'applicazione, se ci riclicco su FUNZIONA!!!
Qualcuno sa dare una spiegazione a questo comportamento strano?
-
Ho notato questo inoltre:
codice:
03-19 11:26:40.901: WARN/IInputConnectionWrapper(386): showStatusIcon on inactive InputConnection
Ogni volta che aggiungo un widget.
Mentre TUTTI GLI ALTRI WIDGET tirano fuori questo:
codice:
03-19 11:27:02.762: WARN/InputManagerService(57): Window already focused, ignoring focus gain of: com.android.internal.view.IInputMethodClient$Stub$Proxy@43d26568
E' una cosa normale?
-
Ci passi un pochino di codice dove setti il pending intent ? Giusto per capire se e dove sbagli
-
OK, grazie per la disponibilità:
Questo è il mio widget_layout:
codice:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="72dip" android:layout_width="72dip"
android:background="@drawable/soswidg" android:id="@+id/widgLinearLayout" android:clickable="true" android:focusable="true">
<TextView android:text="Number"
android:layout_height="wrap_content" android:gravity="center"
android:layout_gravity="center" android:layout_marginBottom="2px"
android:textColor="#000000" android:typeface="serif" android:id="@+id/numberTextView" android:focusable="false" android:focusableInTouchMode="false" android:layout_width="fill_parent">
</TextView>
</LinearLayout>
Questo è il mio onUpdate:
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds){
super.onUpdate(context, appWidgetManager, appWidgetIds);
final int N = appWidgetIds.length;
// Perform this loop procedure for each App Widget that belongs to this provider
for (int i = 0; i < N; i++) {
// For each widgetId
int appWidgetId = appWidgetIds[i];
// Create an Intent to launch listener
Intent msg = new Intent(SOS_INTENT);
msg.putExtra("widgetID", String.valueOf(appWidgetId));
PendingIntent intent = PendingIntent.getBroadcast(context, 1, msg, PendingIntent.FLAG_UPDATE_CURRENT);
//@ BOOT: Retrieve name of widget
SettingManager setManager = new SettingManager(context);
String numberText = setManager.retrieveNumberText(appWidgetId);
// Get the layout for the App Widget and attach an on-click listener
// to the button
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget_layout);
views.setOnClickPendingIntent(R.id.widgLinearLayou t, intent);
views.setViewVisibility(R.id.widgLinearLayout, View.VISIBLE);
views.setTextViewText(R.id.numberTextView, numberText);
views.setViewVisibility(R.id.numberTextView, View.VISIBLE);
//views.setOnClickPendingIntent(R.id.numberTextView, intent);
// Tell the AppWidgetManager to perform an update on the current App Widget
appWidgetManager.updateAppWidget(appWidgetId, views);
}
}
Serve altro?
-
Ho scoperto che eliminando questa riga dal codice delle preference:
appWidgetManager.updateAppWidget(appWidgetId, views);
il click sul widget funziona........
Tuttavia, questa riga non posso eliminarla dal codice....indi per cui, come risolvo?
-
Il pending intent lo stai mettendo sull'intero layout. Prova a metterlo sulla textview e farla un pelo più grande per capire se funziona.
Inoltre SOS_INTENT Cos'è ?
Perchè in questo modo stai lanciando un broadcast con quello che c'è dentro SOS INTENT ... Sarebbe utile per me sapere cosa si trova all'interno di quella Costante.
Fammi sapere.
-
Grazie per i consigli, ti dico cosa ho fatto nel frattempo.
Ho inserito una ImageButton grossa come tutto il layout
Quote:
Inoltre SOS_INTENT. Cos'è?
SOS_INTENT è un mio messaggio inviato in broadcast per far attivare il click, infatti ho un'altra classe:
codice:
@Override
public void onReceive(Context ctx, Intent intent) {
// Get action from intent (e.g. SEND_SOS)
String action = intent.getAction();
if (action.equals(WidgetReceiver.SOS_INTENT)) {
Log.i(TAG, "Click on widget");
....................... //logica dell'applicazione
Sostanzialmente SOS_INTENT è questa:
codice:
public static final String SOS_INTENT = "SEND_SOS";
Il bello è che, riavviando l'emulatore, tutto funziona perfettamente. Quello che non va è l'updateAppWidget all'ìnterno della mia ConfigureActivity. Mi chiedo, non è che l'updateAppWidget va fatto all'interno della classe che estende AppWidgetProvider?
-
Dunque, ho risolto il problema, ma ne ho un altro ancora più grave.
Io ho questa situazione. Assegno un numero di telefono ad ogni widgetID, esempio:
WidgetID23 = 123;
WidgetID24 = 456;
WidgetID25 = 789;
etc...
ovviamente per n widget.
Il mio problema è che nell'update, per ogni widget, io istanzio un PendingIntent per associargli il click settando tutto in questo modo:
codice:
Intent msg = new Intent(SOS_INTENT);
msg.putExtra("widgetID", String.valueOf(appWidgetId));
PendingIntent intent = PendingIntent.getBroadcast(context, -1, msg, PendingIntent.FLAG_UPDATE_CURRENT);
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget_layout);
views.setTextViewText(R.id.numberTextView, text);
views.setOnClickPendingIntent(R.id.widgLinearLayout, intent);
appWidgetManager.updateAppWidget(appWidgetId, views);
Se metto un solo widget funziona (cliccando su WidgetID23 parte la chiamata verso il numero 123), se ne metto un altro e ci clicco sopra parte la chiamata 456.
RICLICCANDO SUL WidgetID23 parte 456........PERCHE'?
-
Ho risolto tutto finalmente. C'è da dire che la documentazione di Android non aiuta per nulla in questi casi e che i PendingIntent hanno un comportamento un pò strano. Appena posso posto la soluzione nella sezione Snippet.
@Andrea: Grazie comunque per la tua disponibilità ;)