Sử dụng lớp dialog fragment trong android

1.Giới thiệu

Dialog là dạng cửa sổ  cho phép người dùng có thể nhập thông tin hoặc xử lý sự kiện.
Ví dụ khi người dùng thoát ứng dụng hoặc xóa dữ liệu ta cần đưa ra một cửa sổ nhỏ để xác nhận thông tin lại lần cuối.
Trong bài viết này tôi sẽ hướng dẫn các bạn sử dụng lớp Dialog Fragment cho phép tùy chinh và khả năng sử dụng cao hơn Dialog bình thường.

2. Cách sử dụng

Có 2 cách để sử dụng lớp này khi tạo một DialogFragment là onCreateView hoặc onCreateDialog.
Sử dụng onCreateView khi  hộp thoại sẽ được xác định thông qua một layout XML.
Sử dụng onCreateDialog khi bạn chỉ cần để xây dựng và cấu hình một lớp Dialog tiêu chuẩn (như AlertDialog).

3. Tạo một và sử dụng Dialog Fragment tổng quát.

Đầu tiên tạo một layout: custom_user_info.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="@dimen/activity_vertical_margin">
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Name"
        android:textSize="18sp"
        android:layout_marginTop="@dimen/activity_vertical_margin"
        android:id="@+id/tv_name"/>
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Class"
        android:textSize="18sp"
        android:id="@+id/tv_class"/>
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="MSSV"
        android:textSize="18sp"
        android:id="@+id/tv_mssv"/>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:paddingTop="@dimen/activity_vertical_margin"
        android:orientation="horizontal">
        <Button
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:id="@+id/btn_update"
            android:text="Update"/>
        <Button
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:id="@+id/btn_close"
            android:text="Close"/>

    </LinearLayout>
</LinearLayout>

Tiếp tục tạo một file  UserInfoDialog.java extent lớp DialogFragment

public class UserInfoDialog extends DialogFragment {
    TextView tvName;
    TextView tvClass;
    TextView tvMSSV;
    Button btnUpdate;
    Button btnClose;

    //Được dùng khi khởi tạo dialog mục đích nhận giá trị
    public static UserInfoDialog newInstance(String data) {
        UserInfoDialog dialog = new UserInfoDialog();
        Bundle args = new Bundle();
        args.putString("data", data);
        dialog.setArguments(args);
        return dialog;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        return inflater.inflate(R.layout.dialog_user_info, container);
    }

    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        // lấy giá trị tự bundle
        String data = getArguments().getString("data", "");
        tvName = (TextView) view.findViewById(R.id.tv_name);
        tvMSSV = (TextView) view.findViewById(R.id.tv_mssv);
        tvClass = (TextView) view.findViewById(R.id.tv_class);
        btnClose = (Button) view.findViewById(R.id.btn_close);
        btnUpdate = (Button) view.findViewById(R.id.btn_update);
        tvName.setText(data);
        tvClass.setText("13DTH02");
        tvMSSV.setText("131151XXX");
        btnUpdate.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Toast.makeText(getActivity(), "Update clicked!", Toast.LENGTH_SHORT).show();
            }
        });
        btnClose.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                getDialog().dismiss();
            }
        });
    }

}

Quay lại activity_main.xml tạo giao diện như sau:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:orientation="vertical"
    tools:context="com.lynkdev.dialogfragment.MainActivity">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="www.AndroidCoBan.Com"
        android:gravity="center"
        android:textSize="24sp"/>
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Hướng dẫn sử dụng lóp Dialog Fragment "
        android:gravity="center"
        android:textSize="18sp"/>
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/btn_show_dialog"
        android:layout_marginTop="@dimen/activity_vertical_margin"
        android:layout_gravity="center"
        android:text="Show Dialog" />
</LinearLayout>

Thiết Lập code cho MainActivity.java để hiện thị Dialog

public class MainActivity extends AppCompatActivity {
    Button btnShowDialog;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btnShowDialog = (Button) findViewById(R.id.btn_show_dialog);
        btnShowDialog.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //Show Dialog và truyền giá trị vào dialog
                // Các bạn có thể truyền cả object nếu muốn.
                FragmentManager fm = getSupportFragmentManager();
                UserInfoDialog userInfoDialog = UserInfoDialog.newInstance("Nguyễn Văn Linh");
                userInfoDialog.show(fm, null);
            }
        });
    }
}

Run app kiểm tra.

Link GitHub

Nguyễn Linh

Chia sẻ để cùng tiến bộ...