2016-01-04 33 views
8

Sto sviluppando i widget per l'applicazione per le note.Come creare un widget Android con opzioni?

Quello che voglio archivio è simile a ColorNote widget

  1. selezionare il widget nota di applicazione enter image description here

  2. Consenti agli utenti di scegliere un elenco di note disponibili memorizzati nella Sqlite enter image description here

  3. Visualizza il widget con il contenuto della nota selezionata. enter image description here

posso visualizzare semplice widget per mostrare semplice messaggio che voglio, ma quello che voglio fare è di permettere agli utenti di selezionare una nota specifica da un elenco di note per essere il contenuto del widget. Ho difficoltà a trovare le risorse correlate, se conosci determinate parole chiave di ricerca, fammelo sapere e farò da sola la ricerca.

risposta

9

Penso che ColorNote utilizza uno Widget Configuration Activity. È possibile trovare un esempio utile sul primo collegamento (che è quello ufficiale) o (perché no) anche there.

per ottenere lo stile "dialogo", è necessario impostare la vostra attività di configurazione del gadget come questo:

<activity 
... 
android:theme="@android:style/Theme.Dialog" 
android:excludeFromRecents="true" /> 

esempio di cui sopra è presa da this answer.

Se si desidera saperne di più sulla progettazione di widget, prendere anche uno sguardo there.

Esempio

1) Creare widget_info e lo mise sulla res/cartella xml:

<?xml version="1.0" encoding="utf-8"?> 
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" 
    android:configure="com.mycompany.app.widgettest.WidgetConfigureActivity" 
    android:initialKeyguardLayout="@layout/widget" 
    android:initialLayout="@layout/widget" 
    android:minHeight="40dp" 
    android:minWidth="40dp" 
    android:resizeMode="horizontal|vertical" 
    android:updatePeriodMillis="86400000" 
    android:widgetCategory="home_screen"> 

</appwidget-provider> 

2) Crea il tuo widget layout di (ho preso la più semplice):

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="#09C" 
    android:padding="@dimen/widget_margin"> 

    <TextView 
     android:id="@+id/appwidget_text" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_centerHorizontal="true" 
     android:layout_centerVertical="true" 
     android:layout_margin="8dp" 
     android:background="#09C" 
     android:contentDescription="@string/appwidget_text" 
     android:text="@string/appwidget_text" 
     android:textColor="#ffffff" 
     android:textSize="24sp" 
     android:textStyle="bold|italic" /> 

</RelativeLayout> 

Sentiti libero di dargli il tuo stile e.

3) Creare la widget_configure layout di attività:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:orientation="vertical" 
    android:padding="16dp"> 

    <TextView 
     android:id="@+id/text_view" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_marginBottom="8dp" 
     android:text="@string/configure" /> 

    <EditText 
     android:id="@+id/appwidget_text" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:inputType="text" 
     android:layout_below="@+id/text_view"/> 

    <ListView 
     android:id="@+id/list" 
     android:layout_height="wrap_content" 
     android:layout_width="match_parent" 
     android:layout_below="@+id/appwidget_text" 
     android:layout_above="@+id/add_button"> 
    </ListView> 

    <Button 
     android:id="@+id/add_button" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_marginTop="8dp" 
     android:text="@string/add_widget" 
     android:layout_alignParentBottom="true" /> 

</RelativeLayout> 

anche lì, sta a voi stile e modificare il layout della vostra attività; nell'esempio sopra, ho aggiunto un testo di modifica che creerà una nota "nuova" (ma non salvata su un database) e una lista con contenuti fittizi. Spetta a te compilare la tua lista, ovviamente presa dal tuo database.

4) Aggiungi al tuo manifesta l'attività di configurazione widget e il provider di widget di così (all'interno del applicazione tag):

 <receiver android:name=".AppWidget"> 
      <intent-filter> 
       <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> 
      </intent-filter> 

      <meta-data 
       android:name="android.appwidget.provider" 
       android:resource="@xml/widget_info" /> 
     </receiver> 

     <activity 
      android:name=".WidgetConfigureActivity" 
      android:theme="@android:style/Theme.Dialog" 
      android:excludeFromRecents="true"> 
      <intent-filter> 
       <action android:name="android.appwidget.action.APPWIDGET_CONFIGURE" /> 
      </intent-filter> 
     </activity> 

5) Creare l'AppWidget classe che si estenderà AppWidgetProvider (preavviso che la configurazione app widget è implementato e gestito nel seguente classe, WidgetConfigureActivity) [non ho aggiunto niente di speciale in questa classe]:

import android.appwidget.AppWidgetProvider; 
import android.appwidget.AppWidgetManager; 
import android.content.Context; 
import android.widget.RemoteViews; 

/** 
* Implementation of App Widget functionality. 
*/ 
public class AppWidget extends AppWidgetProvider { 

    @Override 
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { 
     // There may be multiple widgets active, so update all of them 
     for (int appWidgetId : appWidgetIds) { 
      updateAppWidget(context, appWidgetManager, appWidgetId); 
     } 
    } 

    @Override 
    public void onDeleted(Context context, int[] appWidgetIds) { 
     // When the user deletes the widget, delete the preference associated with it. 
     for (int appWidgetId : appWidgetIds) { 
      WidgetConfigureActivity.deleteTitlePref(context, appWidgetId); 
     } 
    } 

    @Override 
    public void onEnabled(Context context) { 
     // Enter relevant functionality for when the first widget is created 
    } 

    @Override 
    public void onDisabled(Context context) { 
     // Enter relevant functionality for when the last widget is disabled 
    } 

    static void updateAppWidget(Context context, AppWidgetManager appWidgetManager, 
           int appWidgetId) { 

     CharSequence widgetText = WidgetConfigureActivity.loadTitlePref(context, appWidgetId); 
     // Construct the RemoteViews object 
     RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget); 
     views.setTextViewText(R.id.appwidget_text, widgetText); 

     // Instruct the widget manager to update the widget 
     appWidgetManager.updateAppWidget(appWidgetId, views); 
    } 
} 

6) Infine, questo è il WidgetConfigureActivity:

import android.app.Activity; 
import android.appwidget.AppWidgetManager; 
import android.content.Context; 
import android.content.Intent; 
import android.content.SharedPreferences; 
import android.os.Bundle; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.AdapterView; 
import android.widget.ArrayAdapter; 
import android.widget.EditText; 
import android.widget.ListView; 

/** 
* The configuration screen for the {@link AppWidget} com.bepatient.app.widgettest.AppWidget. 
*/ 
public class WidgetConfigureActivity extends Activity { 

    int mAppWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID; 
    EditText mAppWidgetText; 
    private static final String PREFS_NAME = "AppWidget"; 
    private static final String PREF_PREFIX_KEY = "appwidget"; 

    public WidgetConfigureActivity() { 
     super(); 
    } 

    @Override 
    public void onCreate(Bundle icicle) { 
     super.onCreate(icicle); 

     // Set the result to CANCELED. This will cause the widget host to cancel 
     // out of the widget placement if the user presses the back button. 
     setResult(RESULT_CANCELED); 

     setContentView(R.layout.widget_configure); 
     // Set layout size of activity 
     getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); 
     mAppWidgetText = (EditText) findViewById(R.id.appwidget_text); 
     findViewById(R.id.add_button).setOnClickListener(mOnClickListener); 
     final ListView listView = (ListView) findViewById(R.id.list); 

     // Defined array values to show in ListView 
     String[] values = new String[] { "Don't forget the milk!", 
       "Do not forget to go get the mother-in-law", 
       "Go to the laundry", 
       "Marise number" 
     }; 

     ArrayAdapter<String> adapter = new ArrayAdapter<>(this, 
       android.R.layout.simple_list_item_1, android.R.id.text1, values); 

     listView.setAdapter(adapter); 

     // ListView Item Click Listener 
     listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
       // Take ListView clicked item value 
       String widgetText = (String) listView.getItemAtPosition(position); 
       createWidget(getApplicationContext(), widgetText); 
      } 
     }); 

     // Find the widget id from the intent. 
     Intent intent = getIntent(); 
     Bundle extras = intent.getExtras(); 
     if (extras != null) { 
      mAppWidgetId = extras.getInt(
        AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID); 
     } 

     // If this activity was started with an intent without an app widget ID, finish with an error. 
     if (mAppWidgetId == AppWidgetManager.INVALID_APPWIDGET_ID) { 
      finish(); 
      return; 
     } 

     mAppWidgetText.setText(loadTitlePref(WidgetConfigureActivity.this, mAppWidgetId)); 
    } 

    View.OnClickListener mOnClickListener = new View.OnClickListener() { 
     public void onClick(View v) { 
      final Context context = WidgetConfigureActivity.this; 

      // When the button is clicked, get text 
      String widgetText = mAppWidgetText.getText().toString(); 
      createWidget(context, widgetText); 
     } 
    }; 

    private void createWidget(Context context, String widgetText) { 
     // Store the string locally 
     saveTitlePref(context, mAppWidgetId, widgetText); 

     // It is the responsibility of the configuration activity to update the app widget 
     AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); 
     AppWidget.updateAppWidget(context, appWidgetManager, mAppWidgetId); 

     // Make sure we pass back the original appWidgetId 
     Intent resultValue = new Intent(); 
     resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, mAppWidgetId); 
     setResult(RESULT_OK, resultValue); 
     finish(); 
    } 

    // Write the prefix to the SharedPreferences object for this widget 
    static void saveTitlePref(Context context, int appWidgetId, String text) { 
     SharedPreferences.Editor prefs = context.getSharedPreferences(PREFS_NAME, 0).edit(); 
     prefs.putString(PREF_PREFIX_KEY + appWidgetId, text); 
     prefs.apply(); 
    } 

    // Read the prefix from the SharedPreferences object for this widget. 
    // If there is no preference saved, get the default from a resource 
    static String loadTitlePref(Context context, int appWidgetId) { 
     SharedPreferences prefs = context.getSharedPreferences(PREFS_NAME, 0); 
     String titleValue = prefs.getString(PREF_PREFIX_KEY + appWidgetId, null); 
     if (titleValue != null) { 
      return titleValue; 
     } else { 
      return context.getString(R.string.appwidget_text); 
     } 
    } 

    static void deleteTitlePref(Context context, int appWidgetId) { 
     SharedPreferences.Editor prefs = context.getSharedPreferences(PREFS_NAME, 0).edit(); 
     prefs.remove(PREF_PREFIX_KEY + appWidgetId); 
     prefs.apply(); 
    } 
} 

In questa classe si dovrà gestire e compilare tutte le note salvate sul vostro app DB. Quando fai clic su un pulsante o su un elemento, il metodo creaWidget terminerà il lavoro per te.

Prestare attenzione alla seguente riga:

// Set layout size of activity 
getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); 

Questa deve essere chiamata dopo setContentView metodo(), o la vostra attività sarà poco e molto piccolo. Se si esegue questo esempio, si scoprirà che l'attività di configurazione ha uno stile semplice, quindi sarà necessario creare il proprio stile, in base all'interfaccia utente dell'app (se si desidera!).

+0

Avete qualche esempio funzionante? –

+0

@cwfei ho solo il mio codice, che creerà un semplice widget come il tuo. Creerò un esempio rapido con la configurazione. – JJ86

+0

Questo è quello che voglio, facile da capire, grazie :) –