Nice programing

Android에서 클릭 가능한 위젯

nicepro 2020. 11. 30. 19:53
반응형

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);
        }
    }
}

출처 : Android 개발자 문서의 위젯 페이지

따라서 인 텐트를 기반으로 위젯을 클릭 할 때 보류중인 인 텐트가 호출되고 (인 텐트와 보류중인 인 텐트의 차이가 무엇인지 잘 모르겠습니다) 인 텐트는 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

반응형