[Android] Tạo Widget trong ứng dụng Android

Đăng bởi: Admin | Lượt xem: 3258 | Chuyên mục: Android

Widget trong Android là một tiện ích nhỏ chứa các dữ liệu và chức năng quan trọng nhất của ứng dụng có thể truy cập ngay từ màn hình chính của người dùng. Bài viết này sẽ cung cấp cho bạn kiến thức cơ bản về widget và xây dựng một widget đơn giản trong Android.


 Widget trong Android là một tiện ích nhỏ chứa các dữ liệu và chức năng quan trọng nhất của ứng dụng có thể truy cập ngay từ màn hình chính của người dùng. Người dùng có thể di chuyển vị trí các widget màn hình chính của họ và, nếu được hỗ trợ, thay đổi kích thước của chúng để điều chỉnh lượng thông tin trong một widget theo sở thích của họ.

1. Thành phần của một widget 

1.1. AppWidgetProviderInfo

Nơi định nghĩa các thuộc tính của widget như: chiều rộng, chiều cao tối thiểu, file layout giao diện widget, thời gian cập nhật, ảnh xem trước,... Định nghĩa đối tượng AppWidgetProviderInfo trong tài nguyên XML bằng cách sử dụng một phần tử <appwidget-provider> duy nhất và lưu nó trong thư mục res/xml của dự án. 

<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
    android:minWidth="40dp"
    android:minHeight="40dp"
    android:updatePeriodMillis="86400000"
    android:previewImage="@drawable/preview"
    android:initialLayout="@layout/example_appwidget"
    android:configure="com.example.android.ExampleAppWidgetConfigure"
    android:resizeMode="horizontal|vertical"
    android:widgetCategory="home_screen">
</appwidget-provider>

- minWidth, minHeight: chỉ định lượng không gian tối thiểu mà widget sử dụng theo mặc định dựa trên lưới các ô có chiều cao và chiều rộng xác định. Nếu các giá trị cho chiều rộng hoặc chiều cao tối thiểu không khớp với kích thước của các ô, thì kích thước của widget sẽ được làm tròn với kích thước ô gần nhất.

updatePeriodMillis: xác định tần suất widget nên yêu cầu cập nhật từ AppWidgetProvider bằng phương thức onUpdate () tính bằng millisecond (mặc định tối thiểu 30 phút)

initialLayout: trỏ đến file giao diện widget

previewImage: ảnh xem trước widget mà người dùng sẽ thấy

resizeMode: quy định cách widget có thể được thay đổi kích thước (horizontal/vertical/none)

widgetCategory: nơi widget có thể hiển thị: màn hình chính (home_screen), màn hình khóa (keyguard) hay cả hai. Chỉ các phiên bản Android thấp hơn 5.0 mới hỗ trợ các widget màn hình khóa. Đối với Android 5.0 trở lên, chỉ có home_screen là hợp lệ.

1.2. File layout giao diện

Giao diện widget dựa trên RemoteViews chỉ hỗ trợ các ViewGroup:

  • FrameLayout
  • LinearLayout
  • RelativeLayout
  • GridLayout

Và các view:

  • AnalogClock
  • Button
  • Chronometer
  • ImageButton
  • ImageView
  • ProgressBar
  • TextView
  • ViewFlipper
  • ListView
  • GridView
  • StackView
  • AdapterViewFlipper

1.3. AppWidgetProvider

Lớp mở rộng từ BroadcastReceiver, xử lý các sự kiện cập nhật, xóa, bật và tắt widget

- onUpdate()

Được gọi để cập nhật widget theo các khoảng thời gian được xác định bởi thuộc tính updatePeriodMillis trong AppWidgetProviderInfo. Phương thức này cũng được gọi khi người dùng thêm widget, do đó, nó sẽ thực hiện thiết lập thiết yếu ban đầu. Tuy nhiên, nếu bạn đã khai báo một configuration Activity, phương thức này không được gọi khi người dùng thêm widget, nhưng được gọi cho các bản cập nhật tiếp theo. Configuration Activity có trách nhiệm thực hiện cập nhật đầu tiên khi hoàn tất cấu hình. 

Là phương thức quan trọng nhất, sẽ xử lý các tương tác với người dùng nếu có. Ví dụ widget chứa một button khi nhấn sẽ mở 1 Activity:

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

- onDeleted(Context, int[])

Được gọi khi widget bị xóa.

- onEnabled(Context)

Được gọi khi một widget được tạo lần đầu tiên.

- onDisabled(Context)

Được gọi khi phiên bản cuối cùng của widget bị xóa

- onReceive(Context, Intent)

Được gọi cho mỗi lần phát sóng và trước mỗi phương thức ở trên.

2. Ví dụ

Tạo 1 widget đơn giản chứa 1 button khi nhấn sẽ mở MainActivity

- Tạo Widget

- new_app_widget.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@android:color/transparent"
    android:padding="@dimen/widget_margin">

    <Button
        android:id="@+id/bt_click_me"
        android:layout_width="120dp"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:text="Click me"/>

</RelativeLayout>

NewAppWidget.java

public class NewAppWidget extends AppWidgetProvider {

    static void updateAppWidget(Context context, AppWidgetManager appWidgetManager,
                                int appWidgetId) {

        // Tạo intent mở MainActivity
        Intent intent = new Intent(context, MainActivity.class);
        PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);

        // Xử lý sự kiện onClick
        RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.new_app_widget);
        views.setOnClickPendingIntent(R.id.bt_click_me, pendingIntent);

        // Cập nhật widget
        appWidgetManager.updateAppWidget(appWidgetId, views);
    }

    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
        // Có thể có nhiều instance của một widget nên cần cập nhật tất cả
        for (int appWidgetId : appWidgetIds) {
            updateAppWidget(context, appWidgetManager, appWidgetId);
        }
    }

    @Override
    public void onEnabled(Context context) {
        
    }

    @Override
    public void onDisabled(Context context) {
        
    }
}

new_app_widget_info.xml

<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
    android:initialKeyguardLayout="@layout/new_app_widget"
    android:initialLayout="@layout/new_app_widget"
    android:minWidth="250dp"
    android:minHeight="40dp"
    android:previewImage="@drawable/example_appwidget_preview"
    android:resizeMode="horizontal|vertical"
    android:updatePeriodMillis="86400000"
    android:widgetCategory="home_screen" />

AndroidManifest.xml

   <receiver android:name=".widgets.NewAppWidget">
            <intent-filter>
                <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
            </intent-filter>

            <meta-data
                android:name="android.appwidget.provider"
                android:resource="@xml/new_app_widget_info" />
   </receiver>

Link bài viết gốc: https://developer.android.com/guide/topics/appwidgets

Cảm ơn các bạn đã đọc bài viết.

vncoder logo

Theo dõi VnCoder trên Facebook, để cập nhật những bài viết, tin tức và khoá học mới nhất!



Khóa học liên quan

Khóa học: Android

Học Kotlin cơ bản
Số bài học:
Lượt xem: 16954
Đăng bởi: Admin
Chuyên mục: Android

Học lập trình Flutter cơ bản
Số bài học:
Lượt xem: 54375
Đăng bởi: Admin
Chuyên mục: Android

Lập trình Android cơ bản
Số bài học:
Lượt xem: 21992
Đăng bởi: Admin
Chuyên mục: Android