How to create an Android widget with options?

I am developing widgets for a note taking application.

What I want to archive looks like a colorNote widget:

  • Select note application widget enter image description here

  • Allow users to select a list of available notes stored in Sqlite enter image description here

  • Display widget with selected content. enter image description here

I can display a simple widget to show a simple message that I want, but what I want to do is let users select a note to indicate from the list of notes as the contents of the widget. It’s hard for me to find the appropriate resources if you know a specific search keyword, let me know and I will do the research myself.

+8
java android sqlite widget
source share
1 answer

I think that ColorNote uses "Widget Activity" . You can find a useful example at the first link (which is official) or (why not) also there .

To achieve the “dialogue” style, you need to configure the widget’s settings activity as follows:

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

The example above is taken from this answer .

If you want to know more about widget design, look there too.

Example

1) Create widget_info and put it in the res / xml folder:

 <?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) Create a widget layout (I took the simplest one):

 <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> 

Feel free to give it your own style.

3) Create a widget_configure action layout:

 <?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> 

Also exists, it is up to you to style and edit the layout of your activity; in the above example, I added an edit text that will create a “new” note (but it will not be saved in the database) and a list with dummy content. You can fill out your list, of course, taken from your database.

4) Add widget and widget provider settings activity (inside the application tag) to your manifest:

  <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) Create an AppWidget class that extends AppWidgetProvider (note that the application widget configuration is implemented and managed in the following class: WidgetConfigureActivity) [I did not add anything special in this class]:

 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) Finally, this is 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 0123456789" }; 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 this class, you will need to manage and fill out all the notes stored in your application database. When you click a button or item, the createWidget method will complete for you.

Pay attention to the following line:

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

This needs to be called after the setContentView () method, or your activity will be small and tiny. If you run this example, you will find that the configuration activity has a simple style, so you will need to create your own style in accordance with the user interface of your application (if you want!).

+9
source share

All Articles