android - 如何在片段 b 上关闭片段 a?
问题描述
我正在将登录与谷歌集成到我的 android 应用程序的片段中。但是当我登录它时打开一个新的片段b。但是当我按下地方登录按钮时片段b在片段中它再次显示登录窗口
我已经使用了 fragmentTransaction.addToBackStack(null);
登录片段(片段a)
public class LoginFragment1 extends Fragment {
int RC_SIGN_IN = 9001;
GoogleSignInClient mGoogleSignInClient;
SignInButton signInButton;
LoginButton loginButton;
LinearLayout linearLayout,linearLayout1;
CallbackManager callbackManager;
private static final String EMAIL = "email";
@Override
public void onStart() {
super.onStart();
GoogleSignInAccount account =
GoogleSignIn.getLastSignedInAccount(getActivity());
if(account!=null){
updateUI(account);
}
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
callbackManager = CallbackManager.Factory.create();
LoginManager.getInstance().registerCallback(callbackManager, new
FacebookCallback<LoginResult>() {
@Override
public void onSuccess(LoginResult loginResult) {
Log.d(TAG, "onSuccess: "+loginResult );
}
@Override
public void onCancel() {
Log.d(TAG, "onCancel: ");
}
@Override
public void onError(FacebookException error) {
Log.e(TAG, "onError: ",error );
}
});
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
GoogleSignInOptions gso = new
GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestEmail()
.build();
View view = inflater.inflate(R.layout.fragment_login_fragment1,
container, false);
//seting apps name
TextView textView = view.findViewById(R.id.textView6);
String text = "Lets<font color='#faa71a'>Go</font>";
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
textView.setText(Html.fromHtml(text, Html.FROM_HTML_MODE_LEGACY),
TextView.BufferType.SPANNABLE);
} else {
textView.setText(Html.fromHtml(text),
TextView.BufferType.SPANNABLE);
}
//google login
linearLayout = view.findViewById(R.id.linearLayout);
signInButton = view.findViewById(R.id.signInButton);
linearLayout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
signInButton.performClick();
signIn();
}
});
mGoogleSignInClient = GoogleSignIn.getClient(getActivity(), gso);
//facebook login
linearLayout1 = view.findViewById(R.id.linearLayout2);
loginButton = view.findViewById(R.id.loginButton);
CallbackManager callbackManager = CallbackManager.Factory.create();
linearLayout1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
loginButton.performClick();
}
});
loginButton.setFragment(this);
loginButton.setReadPermissions(Arrays.asList("email", "public_profile", "user_friends"));
return view;
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
// Result returned from launching the Intent from GoogleSignInClient.getSignInIntent(...);
if (requestCode == RC_SIGN_IN) {
// The Task returned from this call is always completed, no need to attach
// a listener.
Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data);
handleSignInResult(task);
}
callbackManager.onActivityResult(requestCode, resultCode, data);
super.onActivityResult(requestCode, resultCode, data);
}
private void handleSignInResult(Task<GoogleSignInAccount> completedTask) {
try {
GoogleSignInAccount account = completedTask.getResult(ApiException.class);
// Signed in successfully, show authenticated UI.
updateUI(account);
} catch (ApiException e) {
// The ApiException status code indicates the detailed failure reason.
// Please refer to the GoogleSignInStatusCodes class reference for more information.
Log.w(TAG, "signInResult:failed code=" + e.getStatusCode());
updateUI(null);
}
}
private void signIn() {
Intent signInIntent = mGoogleSignInClient.getSignInIntent();
startActivityForResult(signInIntent, RC_SIGN_IN);
}
private void updateUI(GoogleSignInAccount account) {
Toast.makeText(getActivity(),"signedin" ,Toast.LENGTH_SHORT).show();
Fragment fragment = new StepFragment();
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.fragment, fragment);
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
Toast.makeText(getActivity(),
account.getDisplayName()+"\n"+account.getEmail(),
Toast.LENGTH_SHORT).show();
}
}
用户片段(片段 b)
public class StepFragment extends Fragment {
Button Logoutl;
GoogleSignInClient mGoogleSignInClient;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_step, container, false);
GoogleSignInOptions gso = new
GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestEmail()
.build();
mGoogleSignInClient = (GoogleSignInClient) GoogleSignIn.getClient(getActivity(), gso);
Logoutl = view.findViewById(R.id.button2);
Logoutl.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mGoogleSignInClient.signOut();
}
});
Fragment fragment = new LoginFragment1();
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.detach(fragment);
fragmentTransaction.commit();
return view;
}
}
解决方案
在登录片段内部为登录片段创建标签名称,如下所示public static String TAG = "Login";
在第二个片段中创建一个函数,如下所示
public void removeFragmentByTag(String tag) {
Fragment fragment = getSupportFragmentManager().findFragmentByTag(tag);
if (fragment != null) {
getSupportFragmentManager().beginTransaction().remove(fragment).commit();
}
}
当您在第二个片段中时,通过传递登录片段标签名称来调用此方法,例如
removeFragmentByTag(Login.TAG);
它将删除登录片段
推荐阅读
- javascript - 在 div 中添加一个 span 并使用 dangerouslySetInnerHTML 来显示工具提示
- c# - 为什么我的 Rigidbody2D 不想正常跳跃?
- javascript - 如何定位数组中元素的 Y 坐标
- swift - 多次触发 SwiftUI 列表项
- python-3.x - 制表符分隔的数据到 DataFrame
- excel - MS Excel:如果两个日期之间有任何值,则返回值“$”符号,如果没有,则返回“@”符号
- css - React Native Flexbox Row / Col 问题
- r - R:保存多个 igraph 图
- wpf - 为什么我的 Style.trigger 事件不适用于我的 WPF Datagrid?
- java - ResultSet 列值已修改:有时将随机字符串添加到一个结果集列值