Android開發丶使用DialogFragment完成炫酷的彈窗登入介面並完成DialogFragment與宿主Fragment的通訊
阿新 • • 發佈:2019-01-04
在上篇文件中,我主要記錄了通過介面回撥實現了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回撥過來的引數,我們根據實際開發需求去選取即可。