簡體   English   中英

Android在鎖定屏幕上為AppWidget提供不同的布局

[英]Android Provide Different Layout for AppWidget at Lock Screen

我想要2個用於主屏幕和鎖屏的單獨布局。 我已閱讀https://developer.android.com/guide/topics/appwidgets/index.html#lockscreen,但尚不清楚在何處實現此功能以及如何在運行時更改主屏幕和鎖屏的布局?

如果有明確的教程/示例可以做到這一點,我將不勝感激。

謝謝

如果您知道主屏幕小部件的實現,那很容易。 從下面的代碼中,您可以弄清楚如何對鎖定屏幕和主屏幕使用不同的布局以每秒顯示當前時間。

為不同的小部件創建不同的布局

@ layout / widget_keyguard //用於鎖屏小部件

@ layout / widget_home //用於主屏幕小部件

注意:在兩個布局上都使用一個id為time_view的 TextView來顯示時間

XML / widget_info.xml

<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
    android:initialKeyguardLayout="@layout/widget_keyguard" // layout for lock screen 
    android:initialLayout="@layout/widget_home"   // layout for lock screen (if not provided) & home screen
    android:minHeight="100dp"
    android:minWidth="300dp"
    android:previewImage="@drawable/ic_launcher"
    android:resizeMode="none"
    android:updatePeriodMillis="180000"
    android:widgetCategory="keyguard|home_screen" > //Enable widgets on both home screen and lock screen
</appwidget-provider>

AppWidgetProvider.java

    public class TestAppWidgetProvider extends AppWidgetProvider {

        @Override
        public void onDeleted(Context context, int[] appWidgetIds) {
            super.onDeleted(context, appWidgetIds);
        }

        @Override
        public void onDisabled(Context context) {

            Intent intent = new Intent(context, AlarmManagerBroadcastReceiver.class);

            PendingIntent sender = PendingIntent
                    .getBroadcast(context, 0, intent, 0);

            AlarmManager am = (AlarmManager) context
                    .getSystemService(Context.ALARM_SERVICE);
            am.cancel(sender); //When all the widgets are disabled, do not forget to cancel the service

            super.onDisabled(context);
        }

        @Override
        public void onEnabled(Context context) {

            super.onEnabled(context);

            Toast.makeText(context, "Widget Enabled", Toast.LENGTH_SHORT).show();

              //AlarmManager to update the widgets
            Intent intent = new Intent(context, AlarmManagerBroadcastReceiver.class);

            PendingIntent p_intent = PendingIntent.getBroadcast(context, 0, intent,
                    0);
            AlarmManager am = (AlarmManager) context
                    .getSystemService(Context.ALARM_SERVICE);

            // Here I am updating the widgets every second (1000 ms) , you can use however you want
            am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(),
                    1000, p_intent);

        }

        @Override
        public void onUpdate(Context context, AppWidgetManager appWidgetManager,
                int[] appWidgetIds) {

            Toast.makeText(context, "Widget Updated", Toast.LENGTH_SHORT).show();

            ComponentName thisWidget = new ComponentName(context,
                    TestAppWidgetProvider.class);

            for (int widgetId : appWidgetManager.getAppWidgetIds(thisWidget)) {

                Bundle myOptions = appWidgetManager.getAppWidgetOptions(widgetId);
                int category = myOptions.getInt(
                        AppWidgetManager.OPTION_APPWIDGET_HOST_CATEGORY, -1);

                RemoteViews remoteViews;
                if (category == AppWidgetProviderInfo.WIDGET_CATEGORY_KEYGUARD) {
                    // Get the remote views
                    remoteViews = new RemoteViews(context.getPackageName(),
                            R.layout.widget_keyguard);
                }

                else {
                    remoteViews = new RemoteViews(context.getPackageName(),
                            R.layout.widget_home);
                }

                SimpleDateFormat dateFormat = new SimpleDateFormat(
                        "HH:mm:ss", Locale.US);
                 // use TextView with time_view id on both home screen & lock screen layouts
                remoteViews.setTextViewText(R.id.time_view,
                        dateFormat.format(new Date(System.currentTimeMillis())));
                appWidgetManager.updateAppWidget(widgetId, remoteViews);
            }
        }

        @Override
        public void onAppWidgetOptionsChanged(Context context,
                AppWidgetManager appWidgetManager, int appWidgetId,
                Bundle newOptions) {                
        }

    }

AlarmManagerBroadcastReceiver類

    public class AlarmManagerBroadcastReceiver extends BroadcastReceiver {

        @Override
        public void onReceive(Context context, Intent intent) {
            // TODO Auto-generated method stub


            ComponentName thiswidget = new ComponentName(context,
                    TestAppWidgetProvider.class);

            AppWidgetManager appWidgetManager = AppWidgetManager
                    .getInstance(context);


            for (int widgetId : appWidgetManager.getAppWidgetIds(thiswidget)) {
                Bundle myOptions = appWidgetManager.getAppWidgetOptions(widgetId);
                int category = myOptions.getInt(
                        AppWidgetManager.OPTION_APPWIDGET_HOST_CATEGORY, -1);

                RemoteViews remoteViews;
                if (category == AppWidgetProviderInfo.WIDGET_CATEGORY_KEYGUARD) {
                    // Get the remote views
                    Log.d("Widget", "Lockscreen widget");
                    remoteViews = new RemoteViews(context.getPackageName(),
                            R.layout.widget_keyguard);
                }

                else {
                    Log.d("Widget", "Homescreen widget");
                    remoteViews = new RemoteViews(context.getPackageName(),
                            R.layout.widget_home);
                }
                SimpleDateFormat dateFormat = new SimpleDateFormat(
                        "HH:mm:ss", Locale.US);

                // use TextView with time_view id on both home screen & lock screen layouts                         
                remoteViews.setTextViewText(R.id.time_view,
                        dateFormat.format(new Date(System.currentTimeMillis())));

                appWidgetManager.updateAppWidget(widgetId, remoteViews);
            }

        }

    }

最后,不要忘記更新清單文件

        <application
            ...

            <receiver android:name=".AlarmManagerBroadcastReceiver" />
            <receiver android:name=".TestAppWidgetProvider" >
                <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>

        .....
        </application>

而已。

我希望它能幫助您解決問題

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM