안드로이드의 간편한 위드 제작 방법

8207 단어 Android
넥서스 5를 샀기 때문에 안드로이드의 작은 위젯을 만들어 봤어요.
최초의 안드로이드를 위해 상당히 간단한 샘플을 제작하다.

버튼을 누르면 가산점만 추가됩니다.

안드로이드 위젯


애플릿은 안드로이드 특성상 플랫폼에 다양한 태그를 붙일 수 있는데, 이는 아이폰과 큰 차이가 있는 것으로 API의 레벨3(Android 1.5)부터 사용됐다고 한다.
부품은 다음 절차에 따라 작성할 수 있습니다.
  • 애플릿 설정 파일 만들기
  • 애플릿 레이아웃 만들기
  • AppWidgetProvider의 하위 클래스 만들기
  • BroadcastReceiver의 하위 클래스 제작
  • 안드로이드 매니페스트 수정
  • 1. 부품 프로파일 작성


    다음 XML 파일은 애플릿의 설정 파일로 xml/demo-입니다.widget_provider.xml로 정의합니다.
    xml/demo_widget_provider.xml
    <?xml version="1.0" encoding="utf-8"?>
    <appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
        android:initialLayout="@layout/widget_layout"
        android:minHeight="146dp"
        android:minWidth="292dp"
        android:previewImage="@drawable/widget"
        android:updatePeriodMillis="1000000" >
    </appwidget-provider>
    
  • initialLayout 설정 레이아웃 파일
  • previewImage에 그림을 설정할 때 애플릿의 추가 화면에 미리 보기 그림을 표시할 수 있습니다.
  • 업데이트Period Mills 속성은 애플릿의 업데이트 타이머를 정의합니다. 이 타이머에 따라 AppWidget Provider는 onUpdate 호출 방법으로 부릅니다. (위에 쓰여 있지만 이 샘플은 시간을 줄여도 작동하지 않습니다.)
  • 자세한 내용은 지도 방침에 기재된 것 같습니다.

    2. 부품의 레이아웃 작성


    부품은 다른 활동과 마찬가지로 레이아웃을 설계할 수 있지만 제한이 있습니다.
    레이아웃은 다음 네 개만 사용할 수 있습니다.
  • FrameLayout
  • LinearLayout
  • RelativeLayout
  • GridLayout
  • 부품 클래스는 다음을 지원합니다.
  • AnalogClock
  • Button
  • Chronometer
  • ImageButton
  • ImageView
  • ProgressBar
  • TextView
  • ViewFlipper
  • ListView
  • GridView
  • StackView
  • AdapterViewFlipper
  • 이번 샘플은 아래 글자 필드와 버튼만 만듭니다.
    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_margin="5sp"
        android:orientation="vertical" >
    
        <TextView
            android:id="@+id/title"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:maxLines="2"
            android:paddingBottom="5dp"
            android:textColor="#fcfcfc"
            android:textSize="16sp"
            android:textStyle="bold"
             />
    
        <Button
            android:id="@+id/button"
            android:layout_width="100dp"
            android:layout_height="50dp"
            android:layout_alignParentBottom="true"
            android:layout_alignParentLeft="true"
            android:text="click" />
    
    </RelativeLayout>
    

    3. AppWidgetProvider의 하위 클래스 만들기


    위젯을 제어하기 위해 상속된 AppWidgetProvider 클래스의 카테고리를 추가합니다.
    onUpdate 방법은 실행할 때 화면을 바꾸는 데 사용됩니다.
    이것은 애플릿과의 인터페이스입니다. 샘플에서 onUpdate만 사용했지만, 애플릿의 업데이트, 유효, 무효, 삭제 등 이벤트를 받아들일 수 있습니다.
    public class MyWidgetProvider extends AppWidgetProvider {
    
        @Override
        public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
            // ウィジェットレイアウトの初期化
            RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_layout);
    
            // ボタンイベントを登録
            remoteViews.setOnClickPendingIntent(R.id.button, clickButton(context));
    
            // テキストフィールドに"初期画面"と表示
            remoteViews.setTextViewText(R.id.title, "初期画面");
    
            // アップデートメソッド呼び出し
            pushWidgetUpdate(context, remoteViews);
        }
    
        public static PendingIntent clickButton(Context context) {
            // クリック回数を増加
            MyWidgetIntentReceiver.clickCount ++;
    
            // initiate widget update request
            Intent intent = new Intent();
            intent.setAction("UPDATE_WIDGET");
            return PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
        }
    
        // アップデート
        public static void pushWidgetUpdate(Context context, RemoteViews remoteViews) {
            ComponentName myWidget = new ComponentName(context, MyWidgetProvider.class);
            AppWidgetManager manager = AppWidgetManager.getInstance(context);
            manager.updateAppWidget(myWidget, remoteViews);
        }
    }
    

    4.BroadcastReceiver의 하위 클래스 제작


    버튼을 클릭할 때의 동작을 실현하기 위해 BroadcastReceiver를 설치합니다.
    onReceive 방법으로 부품을 구현합니다.
    public class MyWidgetIntentReceiver extends BroadcastReceiver {
        public static int clickCount = 0;
    
        @Override
        public void onReceive(Context context, Intent intent) {
            if (intent.getAction().equals("UPDATE_WIDGET")) {
                RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_layout);
    
                // テキストをクリック回数を元に更新
                remoteViews.setTextViewText(R.id.title, "クリック回数: " + MyWidgetIntentReceiver.clickCount);
    
                // もう一回クリックイベントを登録(毎回登録しないと上手く動かず)
                remoteViews.setOnClickPendingIntent(R.id.button, MyWidgetProvider.clickButton(context));
    
                MyWidgetProvider.pushWidgetUpdate(context.getApplicationContext(), remoteViews);
            }
        }
    }
    

    5. Android 선언에 receiver 등록


    마지막으로 선언문건을 작성하고 부품을 등록한다.
    (demo widget provider는 1에 정의된 XML 파일입니다.)
    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.torua.hellowidget"
        android:versionCode="1"
        android:versionName="1.0" >
    
        <uses-sdk
            android:minSdkVersion="8"
            android:targetSdkVersion="18" />
    
        <application
            android:allowBackup="true"
            android:icon="@drawable/ic_launcher"
            android:label="@string/app_name"
            android:theme="@style/AppTheme" >
             <receiver android:name=".MyWidgetProvider" >
                <intent-filter>
                    <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
                </intent-filter>
    
                <meta-data
                    android:name="android.appwidget.provider"
                    android:resource="@xml/demo_widget_provider" />
            </receiver>
            <receiver
                android:name=".MyWidgetIntentReceiver"
                android:label="@string/app_name" >
                <intent-filter>
                    <action android:name="UPDATE_WIDGET" />
                </intent-filter>
    
                <meta-data
                    android:name="android.appwidget.provider"
                    android:resource="@xml/demo_widget_provider" />
            </receiver>
        </application>
    </manifest>
    
    작업 프로세스는 다음과 같습니다.
    애플릿 등록.onUpdate→그리기
  • 버튼→내부 텐트(UPDATE WIDGET)→My Widget Intent Receiver를 클릭합니다.onReceive→그리기
  • 참고 자료

  • App Widgets | Android Developers
  • App Widget Design Guidelines
  • Homescreen App Widgets Example in Android
  • 좋은 웹페이지 즐겨찾기