1. 程式人生 > >Android開發丶使用DialogFragment完成炫酷的彈窗登入介面並完成DialogFragment與宿主Fragment的通訊

Android開發丶使用DialogFragment完成炫酷的彈窗登入介面並完成DialogFragment與宿主Fragment的通訊

在上篇文件中,我主要記錄了通過介面回撥實現了DialogFragment與宿主Acitivity的通訊,但是在實際開發過程中,登入介面往往是從“我的”這個Fragment開啟的,這裡發現介面回撥不是很好用,查閱了很多文件,都沒有很好的解決辦法,因此,怎樣把輸入的賬戶名和密碼由DialogFragment傳遞給宿主Fragment以便完成進一步的網路請求等操作就成了我們亟待解決的問題,這裡我們通過setTartgetFragment()這個方法即可解決。

這裡因為介面等基本與上篇與Activity互動的文件相同,所以不再詳細贅述,可以參考如下文件。

首先看下實際效果。


實現步驟:

1.在DialogFragment這個方法裡,在登入按鈕的onClick點選事件裡設定監聽。

@Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.login_btn:
                if (getTargetFragment()== null){
                    return;
                }
                Intent intent= new Intent();
                intent.putExtra(USERNAME, mUsername.getText().toString());
                intent.putExtra(USERPASSWORD, mPassword.getText().toString());
                getTargetFragment().onActivityResult(MainFragment.REQUEST_CODE, Activity.RESULT_OK, intent);
                break;
        }
    }

完整程式碼:

package com.fantasychong.dialogfragmentlogin2;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.DialogFragment;
import android.content.Intent;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.TextView;

/**
 * Created by lenovo on 2018/2/8.
 */

public class LoginDailogFragment extends DialogFragment implements View.OnClickListener {

    public static final String USERNAME = "userName";
    public static final String USERPASSWORD = "userPassword";
    private EditText mUsername;
    private EditText mPassword;
    private Button btn;
    private ImageView iv;
    private TextView toReg;
    private ProgressBar pb;
    private LoginDailogFragment fragment;


    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        //設定背景透明
        getDialog().getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
        return super.onCreateView(inflater, container, savedInstanceState);
    }

    @NonNull
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        View view= LayoutInflater.from(getActivity()).inflate(R.layout.dialog_login, null);
        iv= view.findViewById(R.id.login_iv);
        toReg= view.findViewById(R.id.login_register);
        mUsername= view.findViewById(R.id.login_et1);
        btn= view.findViewById(R.id.login_btn);
        mPassword= view.findViewById(R.id.login_et2);
        iv.setOnClickListener(this);
        toReg.setOnClickListener(this);
        btn.setOnClickListener(this);

        builder.setView(view);
        return builder.create();
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.login_btn:
                if (getTargetFragment()== null){
                    return;
                }
                Intent intent= new Intent();
                intent.putExtra(USERNAME, mUsername.getText().toString());
                intent.putExtra(USERPASSWORD, mPassword.getText().toString());
                getTargetFragment().onActivityResult(MainFragment.REQUEST_CODE, Activity.RESULT_OK, intent);
                break;
        }
    }
}

2.在宿主Fragment裡設定onActivityResult方法設定回撥的引數。

 @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode== REQUEST_CODE){
            String userName= data.getStringExtra(LoginDailogFragment.USERNAME);
            String userPassword= data.getStringExtra(LoginDailogFragment.USERPASSWORD);
            name.setText(userName);
            password.setText(userPassword);
            fragment.dismiss();
        }
    }

3.在宿主Fragment開啟DialogFragment的入口處設定監聽。

login.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                fragment= new LoginDailogFragment();
                fragment.setTargetFragment(MainFragment.this, REQUEST_CODE);
                fragment.show(getFragmentManager(), "login");
            }
        });

完整程式碼:

package com.fantasychong.dialogfragmentlogin2;

import android.app.Fragment;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;

public class MainFragment extends Fragment {

    public static final int REQUEST_CODE = 1;

    private Button login;
    private TextView name;
    private TextView password;
    private LoginDailogFragment fragment;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view= LayoutInflater.from(getActivity()).inflate(R.layout.fragment_main, container, false);
        login= view.findViewById(R.id.main_login);
        name= view.findViewById(R.id.main_name);
        password= view.findViewById(R.id.main_password);

        login.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                fragment= new LoginDailogFragment();
                fragment.setTargetFragment(MainFragment.this, REQUEST_CODE);
                fragment.show(getFragmentManager(), "login");
            }
        });
        return view;
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode== REQUEST_CODE){
            String userName= data.getStringExtra(LoginDailogFragment.USERNAME);
            String userPassword= data.getStringExtra(LoginDailogFragment.USERPASSWORD);
            name.setText(userName);
            password.setText(userPassword);
            fragment.dismiss();
        }
    }
}

至此全部完成,我們可以看到無論是宿主Activity還是宿主Fragment都可以接收到DialogFragment回撥過來的引數,我們根據實際開發需求去選取即可。