Android에서 클릭 가능한 위젯
개발자 문서가 여기서 실패한 것 같습니다. 생각없이 정적 위젯을 만들 수 있습니다. 아날로그 시계 위젯과 같이 자체적으로 업데이트되는 위젯도 만들 수 있습니다.하지만 사용자가 클릭 할 때 반응하는 위젯을 만드는 방법을 평생 알 수는 없습니다. 그것. 다음은 개발자 문서에서 위젯 활동에 포함되어야하는 내용에 대해 제공하는 최고의 코드 샘플입니다 (다른 유일한 힌트는 정적 위젯 만 생성하는 API 데모입니다).
public class ExampleAppWidgetProvider extends AppWidgetProvider {
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
final int N = appWidgetIds.length;
// Perform this loop procedure for each App Widget that belongs to this provider
for (int i=0; i<N; i++) {
int appWidgetId = appWidgetIds[i];
// Create an Intent to launch ExampleActivity
Intent intent = new Intent(context, ExampleActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);
// Get the layout for the App Widget and attach an on-click listener to the button
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.appwidget_provider_layout);
views.setOnClickPendingIntent(R.id.button, pendingIntent);
// Tell the AppWidgetManager to perform an update on the current App Widget
appWidgetManager.updateAppWidget(appWidgetId, views);
}
}
}
따라서 인 텐트를 기반으로 위젯을 클릭 할 때 보류중인 인 텐트가 호출되고 (인 텐트와 보류중인 인 텐트의 차이가 무엇인지 잘 모르겠습니다) 인 텐트는 ExampleActivity 클래스에 대한 것 같습니다. . 그래서 샘플 액티비티 클래스를 생성했을 때 mediaplayer 객체를 생성하고 시작하는 간단한 액티비티로 만들었습니다 (객체를 해제하지 않았으므로 결국 충돌이 발생합니다. 코드는 다음과 같습니다.
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
MediaPlayer mp = MediaPlayer.create(getApplicationContext(), R.raw.sound);
mp.start();
}
그러나 홈 화면에 위젯을 추가하고 클릭했을 때 아무것도 재생되지 않았고 실제로 업데이트 타이머를 몇 백 밀리 초로 설정했을 때 아무것도 재생되지 않았습니다 (appwidget 공급자 xml 파일에서). 또한 중단 점을 설정하고 활동에 도달하지 않았을뿐만 아니라 설정 한 중단 점도 트리거되지 않는다는 것을 알았습니다. (나는 여전히 그 이유를 파악하지 못했습니다) 그러나 logcat은 활동 클래스 파일이 실행 중임을 나타내는 것 같습니다.
그렇다면 클릭에 응답하는 앱 위젯을 얻을 수있는 방법이 있습니까? onClickPendingIntent () 메서드가 onClick 유형의 메서드에 가장 가깝기 때문에.
대단히 감사합니다.
먼저 상수가있는 정적 변수를 추가합니다.
public static String YOUR_AWESOME_ACTION = "YourAwesomeAction";
그런 다음 보류중인 인 텐트에 인 텐트를 추가하기 전에 인 텐트에 작업을 추가해야합니다.
Intent intent = new Intent(context, widget.class);
intent.setAction(YOUR_AWESOME_ACTION);
(여기서 widget.class는 현재 클래스 인 AppWidgetProvider의 클래스입니다)
그런 다음 getBroadcast를 사용하여 PendingIntent를 만들어야합니다.
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0);
위젯에서 클릭 가능한보기에 대한 onClickPendingIntent 설정
remoteView.setOnClickPendingIntent(R.id.widgetFrameLayout, pendingIntent);
다음으로 동일한 클래스에서 onReceive 메서드를 재정의합니다.
@Override
public void onReceive(Context context, Intent intent) {
super.onReceive(context, intent);
그런 다음 onReceive 메서드 내에서 작업에 대해 반환 된 인 텐트를 쿼리하여 버튼 누름에 응답합니다.
if (intent.getAction().equals(YOUR_AWESOME_ACTION)) {
//do some really cool stuff here
}
그리고 그렇게해야합니다!
onUpdate 메소드를 그대로두고 로직을 updateAppWidget에 복사하여 붙여 넣으십시오 .
static void updateAppWidget(Context context, AppWidgetManager appWidgetManager,
int appWidgetId) {
// Create an Intent to launch ExampleActivity when clicked
Intent intent = new Intent(context, ExampleActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);
// Construct the RemoteViews object
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.appwidget_provider_layout);
// Widgets allow click handlers to only launch pending intents
views.setOnClickPendingIntent(R.id.button, pendingIntent);
// Instruct the widget manager to update the widget
appWidgetManager.updateAppWidget(appWidgetId, views);
}
@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);
}
}
추신. PendingIntent 는 다른 응용 프로그램이 응용 프로그램 에서 해당 Intent에 액세스하고 실행할 수 있도록하는 Intent의 "상자"입니다 .
참고 URL : https://stackoverflow.com/questions/2748590/clickable-widgets-in-android
'Nice programing' 카테고리의 다른 글
Android 에뮬레이터에서 로컬 호스트 테스트 (0) | 2020.11.30 |
---|---|
UISwitch 기능이있는 iPhone UIButton (0) | 2020.11.30 |
옵션 유형 목록을 하나도없는 요소로 압축하는 가장 좋은 방법은 무엇입니까? (0) | 2020.11.30 |
쉘 스크립트에서 원격 파일 크기를 얻는 방법은 무엇입니까? (0) | 2020.11.30 |
파이썬에서 '인쇄'란 무엇입니까? (0) | 2020.11.30 |