2014-09-08 1 views
1

홈 화면과 잠금 화면을위한 2 개의 개별 레이아웃이 필요합니다. 내가 읽었습니다 https://developer.android.com/guide/topics/appwidgets/index.html#lockscreen 그러나 이것을 구현할 곳이 어디인지, 홈 화면과 잠금 화면 모두 런타임시 레이아웃을 변경하는 방법이 명확하지 않습니까?Android는 잠금 화면에서 AppWidget에 다른 레이아웃을 제공합니다.

명확한 튜토리얼/예를 들어 주시면 고맙겠습니다.

감사합니다.

답변

0

홈 스크린 위젯 구현을 알고 있다면 쉽게 할 수 있습니다. 아래 코드에서 잠금 화면과 홈 화면에 다른 레이아웃을 사용하여 매초마다 현재 시간을 표시하는 방법을 알 수 있습니다.

다른 위젯

에 대한 다른 레이아웃 만들기 레이아웃/widget_keyguard // 잠금 화면 위젯

@ 레이아웃/widget_home // 홈 화면 위젯

참고 @ ID를 사용하여 하나의 텍스트 뷰 양쪽에 배치 time_view은 시간을 표시

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> 

을 업데이트하는 것을 잊지 마세요.

귀하의 문제를 해결하는 데 도움이되기를 바랍니다.

+0

감사합니다. @Adarsh ​​Urs. 나는 아직도 다른 프로젝트로 바쁩니다. 나는 지금 그것을 시도 할 수 없다. 나는 그것이 효과가 있어야한다고 생각한다. 나는 당신의 대답을 받아 들일 것입니다. 그러나 안드로이드 5.0이 잠금 화면에 위젯을 넣을 수있는 기능을 제거한 이후로 어쨌든 구현하지 않을 것이라고 생각합니다. – rxlky