Android UI 구성 요소 AppWidget 컨트롤 입문 상세 설명
위 젯 은 데스크 톱 에 놓 인 작은 구성 요소(마 운 트)로 이해 할 수 있 습 니 다.위 젯 이 있 으 면 음악 을 재생 하 는 등 데스크 톱 에서 다양한 작업 을 편리 하 게 할 수 있 습 니 다.
데스크 톱 을 길 게 누 르 면 위 젯 옵션 을 볼 수 있 습 니 다.아래 그림 과 같 습 니 다.
위의 그림 에서 화살표 에 있 는 widgets 아이콘 을 누 르 면 다음 화면 이 나타 납 니 다.(모두 widget)
위의 그림 의 임의의 widget 을 길 게 누 르 면 데스크 톱 에 올 릴 수 있 습 니 다.
Widget 사용
Widget 의 실현 방향
(1)Android Manifest 에서 AppWidget 을 성명 합 니 다.
(2)xml 디 렉 터 리 에서 AppWidget 의 설정 파일 을 정의 합 니 다.
(3)layot 디 렉 터 리 에서 Widget 의 레이아웃 파일 을 정의 합 니 다.
(4)새로운 클래스 를 만 들 고 AppWidget Provider 클래스 를 계승 하여 구체 적 인 widget 업무 논 리 를 실현 합 니 다.
AppWidgetProvider 를 계승 하기 위해 서 는 새로운 클래스 가 필요 합 니 다.앱 위 젯 프로 바 이 더 를 눌 러 보 니 앱 위 젯 프로 바 이 더 가 브 로드 캐 스 트 Receiver 에서 계승 되 었 습 니 다.
왜 Widget 은 라디오 수신 기인 가요?브 로드 캐 스 트 Receiver 클래스 에 서 는 라디오 를 받 을 수 있 는 onReceive 방법 이 있다 는 것 을 알 고 있 습 니 다.우리 가 데스크 톱 마 운 트 에서 작업 을 할 때 반드시 응용 변 화 를 일 으 킬 것 이다.이것 은 마 운 트 와 응용 간 의 통신 과 관련 되 는데 이때 방송 으로 통신 하 는 것 이 더 할 나 위 없 이 좋다.
Widget 의 구체 적 인 사용 절차
(1)TestWidget.java 클래스 를 새로 만 들 고 AppWidget Provider 를 계승 합 니 다.
TestWidget.java:
import android.appwidget.AppWidgetProvider;
import android.content.Context;
import android.content.Intent;
/**
* Created by smyhvae on 2016/9/7.
*/
public class TestWidget extends AppWidgetProvider{
@Override
public void onReceive(Context context, Intent intent) {
super.onReceive(context, intent);
}
}
(2)Widget 은 라디오 수신 기 이기 때문에 목록 파일 에 등록 해 야 합 니 다.
<!-- widget AppWidgetProvider -->
<receiver android:name=".TestWidget">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE"/>
</intent-filter>
<meta-data
android:name="android.appwidget.provider"
android:resource="@layout/widget_setting"/>
</receiver>
04 줄:action 은 여과 조건 으로 행 위 를 걸 러 내 고 widget 의 업 데 이 트 를 모니터링 합 니 다.08 줄:android:resource 에서 widget 설정 을 지 정 했 습 니 다.우 리 는 속성 이 목록 파일 에 데 이 터 를 저장 하 는 데 쓰 인 다 는 것 을 안다.
(3)layot 폴 더 에 새 파일 widgetsetting.xml:(widget 설정 파일)
setting_widget.xml:
<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:initialLayout="@layout/layout_widget"
android:minHeight="140dp"
android:minWidth="140dp"
android:previewImage="@mipmap/ic_launcher"
android:updatePeriodMillis="20000"
android:widgetCategory="home_screen"
>
</appwidget-provider>
08 줄:android:initialLayout 에서 widget 의 레이아웃 을 지 정 했 습 니 다.09 줄:android:updatePeriodMillis 가 업데이트 시간 주 기 를 지정 합 니 다.
10 줄:android:widgetCategory="homescreen"widget 을 메 인 화면 에 표시 합 니 다.(잠 금 화면 에 도 표시 할 수 있 습 니 다)
(4)layot 폴 더 에 새 파일 layotwidget.xml:(widget 레이아웃)
layout_widget.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="Large Text"
android:textAppearance="?android:attr/textAppearanceLarge"/>
<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="New Button"/>
</LinearLayout>
여기까지 하면 프로그램 이 달 릴 수 있다.프로그램 을 실행 한 후 데스크 톱 을 길 게 누 르 고"Widget"단 추 를 누 르 면 우리 가 방금 디자인 한 widget 을 볼 수 있 습 니 다. 위의 그림 의 화살 표를 길 게 누 르 면 우리 가 디자인 한 widget 을 데스크 톱 에 끌 어 다 놓 을 수 있 습 니 다.
Widget 의 클릭 과 업데이트[중요]
TestWidget.java 는 AppWidget Provider 로부터 계승 되 었 고,AppWidget Provider 는 BroadcastReceiver 를 계승 한 후 onReceiver 방법 을 다시 쓰 고 여러 가지 방법 을 사용자 정의 한 것 을 알 고 있 습 니 다.
위의 그림 에는 삭제 되 었 을 때,비활성화 되 었 을 때,활성화 되 었 을 때,업데이트 되 었 을 때 등 여러 가지 방법 이 포함 되 어 있다.특히 중요 한 것 은 onReceive()방법 과 onUpDate()방법 이다.
작은 위 젯 이 바 뀌 었 을 때(예 를 들 어 데스크 톱 에 설치 되 었 을 때)시스템 은 업 데 이 트 된 방송 을 보 냅 니 다(위의 빨 간 상자 부분 참조).저 희 는 settingwidget.xml 에 widget 의 업데이트 주파 수 를 설정 하 였 습 니 다.이것 도 업 데 이 트 를 호출 합 니 다.
내 가 켜 면 날씨 등 widget 이 왜 업데이트 되 지 않 느 냐 고 물 을 수도 있다.프로 세 스 가 죽 었 기 때 문 입 니 다.이 컨트롤 을 먼저 제거 한 다음 에 설치 할 수 밖 에 없습니다.이 때 응용 프로그램 은 update 업데이트 방송 을 보 냅 니 다.
widget 의 클릭 과 업 데 이 트 를 해 야 할 때,우 리 는 onUpdate()방법 을 다시 써 서 방송 을 보 내야 합 니 다.프로그램 이 초기 화 될 때 시스템 은 onUpdate()방법 을 호출 합 니 다.
onUpdate()방법의 코드 는 다음 과 같 습 니 다.
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
super.onUpdate(context, appWidgetManager, appWidgetIds);
RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.layout_widget);// RemoteViews
Intent intent = new Intent();
intent.setClass(context, TestWidget.class); // intent TestWidget ,TestWidget , 。。 // 。
intent.setAction(WIDGET_BTN_ACTION);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0);
remoteViews.setOnClickPendingIntent(R.id.widget_btn, pendingIntent);// btn_widget : , action 。
appWidgetManager.updateAppWidget(appWidgetIds, remoteViews); // , 。
}
코드 설명:먼저 new 하나의 RemoteViews 가 필요 합 니 다.구조 방법 에서 두 개의 인 자 를 전달 해 야 합 니 다.하 나 는 가방 이름(context.getPacakgeName)이 고 하 나 는 레이아웃 파일(layotwidget)。
그리고 reoteViews.setOnClickPendingIntent()설정 단 추 를 통 해 이 벤트 를 클릭 합 니 다.setOnClickPendingIntent()에서 두 개의 인 자 를 전달 해 야 합 니 다.하 나 는 id(예 를 들 어 클릭 해 야 하 는 button)이 고 하 나 는 PendingIntent 입 니 다.PendingIntent 는 미래의 의도 입 니 다.
그래서 우 리 는 PendingIntent 를 미리 구성 해 야 한다.이것 은 PendingIntent.getBroadcast()를 통 해 구성 해 야 한다.getBroadcast()방법 중 하 나 는 Intent 입 니 다.
그래서 우 리 는 Intent 를 만들어 야 한다.intent 에서 라디오 를 보 내 고 Action 을 설정 합 니 다.
단 추 를 눌 렀 을 때 appWidgetManager.updateAppWidget(int[]appWidgetIds,RemoteViews views)방법 으로 업데이트 하 십시오.첫 번 째 매개 변 수 는 onUpdate 방법의 매개 변수 입 니 다.모든 컨트롤 을 대표 합 니 다.
onUpdate()방법 에서 intent 를 통 해 단 추 를 누 르 고 시간 을 누 르 는 방송 을 보 낸 후에 우 리 는 onReceive()방법 에서 방송 을 받 아야 합 니 다.
onReceive()방법의 코드 는 다음 과 같 습 니 다.
@Override
public void onReceive(Context context, Intent intent) {
super.onReceive(context, intent);
if (intent != null && TextUtils.equals(intent.getAction(), WIDGET_BTN_ACTION)) { // intent , action , ,
Log.i(WIDGET_BTN_ACTION, "is clicked");
//
RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.layout_widget);// : 【 】 RemoteViews
remoteViews.setTextViewText(R.id.widget_tv, "be clicked");
remoteViews.setTextColor(R.id.widget_tv, Color.RED);
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);//
ComponentName componentName = new ComponentName(context, TestWidget.class);
appWidgetManager.updateAppWidget(componentName, remoteViews);//setText ,
}
}
코드 설명:intent 의 action 이 성공 적 으로 일치 할 때 클릭 시간 후의 setText 를 실행 하기 시 작 했 습 니 다.그러나 여기 서 는 onUpdate()방법 중의 RemoteViews 를 공유 할 수 없습니다.(이것 은 매우 큰 구덩이 입 니 다.)
이벤트 클릭 후의 setText 를 실행 한 후,app WidgetManager.updateAppWidget(ComponentName,RemoteViews)방법 을 호출 하 십시오.첫 번 째 매개 변 수 는 구성 요소 이름 입 니 다.우리 스스로 new 를 사용 해 야 합 니 다.두 번 째 매개 변 수 는 설명 하기 쉽 습 니 다.
종합 적 으로 말 하면 TestWidget.java 의 전체 버 전 코드 는 다음 과 같 습 니 다.
Testwidget.java:
import android.app.PendingIntent;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.text.TextUtils;
import android.util.Log;
import android.widget.RemoteViews;
/**
* Created by smyhvae on 2016/9/7.
*/
public class TestWidget extends AppWidgetProvider {
public static final String WIDGET_BTN_ACTION = "widget_btn_action";
@Override
public void onReceive(Context context, Intent intent) {
super.onReceive(context, intent);
if (intent != null && TextUtils.equals(intent.getAction(), WIDGET_BTN_ACTION)) { // intent , action , ,
Log.i(WIDGET_BTN_ACTION, "is clicked");
//
RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.layout_widget);// : 【 】 RemoteViews
remoteViews.setTextViewText(R.id.widget_tv, "be clicked");
remoteViews.setTextColor(R.id.widget_tv, Color.RED);
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);//
ComponentName componentName = new ComponentName(context, TestWidget.class);
appWidgetManager.updateAppWidget(componentName, remoteViews);//setText ,
}
}
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
super.onUpdate(context, appWidgetManager, appWidgetIds);
RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.layout_widget);// RemoteViews
Intent intent = new Intent();
intent.setClass(context, TestWidget.class); // intent TestWidget ,TestWidget , 。。 // 。
intent.setAction(WIDGET_BTN_ACTION);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0);
remoteViews.setOnClickPendingIntent(R.id.widget_btn, pendingIntent);// btn_widget : , action 。
appWidgetManager.updateAppWidget(appWidgetIds, remoteViews); // , 。
}
}
실행 후 widget 을 데스크 톱 으로 끌 어 올 립 니 다.효 과 는 다음 과 같 습 니 다.버튼 을 누 르 면 효과 가 다음 과 같 습 니 다.
프로젝트 파일:(Android Studio 2.1)
물론 widget 은 다른 용도 도 많 습 니 다.예 를 들 면:
•서비스 와 통신 하 다
•widget 컨트롤 의 대화 방법.
•데스크 톱 재생 기 위 젯 만 들 기
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Bitrise에서 배포 어플리케이션 설정 테스트하기이 글은 Bitrise 광고 달력의 23일째 글입니다. 자체 또는 당사 등에서 Bitrise 구축 서비스를 사용합니다. 그나저나 며칠 전 Bitrise User Group Meetup #3에서 아래 슬라이드를 발표했...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.