java onclick事件 - android中的可點擊小部件





button換頁 onclicklistener用法 (2)


首先,添加一個帶常量的靜態變量。

public static String YOUR_AWESOME_ACTION = "YourAwesomeAction";

然後,在將意圖添加到掛起的intent之前,需要將操作添加到intent中:

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
}

這應該做到!

開發人員文檔似乎在這裡失敗了。 我可以不假思索地創建一個靜態小部件,我甚至可以創建一個像模擬時鍾小部件一樣的小部件來更新自己,但是,我不能在我的生活中弄清楚如何創建一個小部件來響應用戶點擊的時間它。 以下是開發人員文檔為小部件活動應包含的內容提供的最佳代碼示例(唯一的其他提示是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開發者文檔的小部件頁面

因此,看起來在單擊小部件時調用掛起的intent,這是基於intent(我不太確定intent和掛起的intent之間的區別是什麼),而intent是針對ExampleActivity類的。 所以我讓我的示例活動類成為一個簡單的活動,在創建時,會創建一個mediaplayer對象,然後啟動它(它不會釋放對象,所以它最終會崩潰,這是它的代碼:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    MediaPlayer mp = MediaPlayer.create(getApplicationContext(), R.raw.sound);
    mp.start();
}

但是,當我將小部件添加到主屏幕並單擊它時,實際上沒有播放任何內容,當我將更新計時器設置為幾百毫秒時(在appwidget提供程序xml文件中)。 此外,我設置了斷點,並發現它不僅沒有達到活動,而且我設置的斷點也不會被觸發。 (我仍然沒有弄清楚為什麼會這樣),但是,logcat似乎表明正在運行活動類文件。

那麼,有什麼辦法可以讓appwidget響應點擊嗎? 因為onClickPendingIntent()方法是我找到的onClick類型的方法最接近。

非常感謝你。




使用String連接由編譯器轉換為StringBuilder操作。

為了看看編譯器是如何做的,我將採用一個示例類,編譯它並用jad對其進行反編譯,看看生成的字節碼是什麼。

原班:

public void method1() {
    System.out.println("The answer is: " + 42);
}

public void method2(int value) {
    System.out.println("The answer is: " + value);
}

public void method3(int value) {
    String a = "The answer is: " + value;
    System.out.println(a + " what is the question ?");
}

反編譯類:

public void method1()
{
    System.out.println("The answer is: 42");
}

public void method2(int value)
{
    System.out.println((new StringBuilder("The answer is: ")).append(value).toString());
}

public void method3(int value)
{
    String a = (new StringBuilder("The answer is: ")).append(value).toString();
    System.out.println((new StringBuilder(String.valueOf(a))).append(" what is the question ?").toString());
}
  • method1 ,編譯器在編譯時執行了該操作。
  • method2String連接等效於手動使用StringBuilder
  • method3String連接肯定是壞的,因為編譯器正在創建第二個StringBuilder而不是重用前一個。

所以我的簡單規則是連接是好的,除非你需要再次連接結果:例如在循環中或當你需要存儲中間結果時。







java android onclick android-widget