【问题标题】:Implementing Firebase Account Settings In OverFlow Menu在溢出菜单中实施 Firebase 帐户设置
【发布时间】:2016-11-27 11:06:51
【问题描述】:

我是 Firebase 和开发方面的新手,我使用 Firebase 制作了一个应用程序,并为其提供了登录和注销的方法,但在活动中,我希望通过 OverFlow 菜单完成注销和其他帐户设置如果可能的话。

我想在溢出菜单上实现的活动代码:

import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ProgressBar;
import android.widget.Toast;

import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.auth.FirebaseAuth; 
import com.google.firebase.auth.FirebaseUser;

public class MainActivity extends AppCompatActivity {

private Button btnChangeEmail, btnChangePassword, btnSendResetEmail,    btnRemoveUser,
        changeEmail, changePassword, sendEmail, remove, signOut;

private EditText oldEmail, newEmail, password, newPassword;
private ProgressBar progressBar;
private FirebaseAuth.AuthStateListener authListener;
private FirebaseAuth auth;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    toolbar.setTitle(getString(R.string.app_name));
    setSupportActionBar(toolbar);

    //get firebase auth instance
    auth = FirebaseAuth.getInstance();

    //get current user
    final FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();

    authListener = new FirebaseAuth.AuthStateListener() {
        @Override
        public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
            FirebaseUser user = firebaseAuth.getCurrentUser();
            if (user == null) {
                // user auth state is changed - user is null
                // launch login activity
                startActivity(new Intent(MainActivity.this, LoginActivity.class));
                finish();
            }
        }
    };

    btnChangeEmail = (Button) findViewById(R.id.change_email_button);
    btnChangePassword = (Button) findViewById(R.id.change_password_button);
    btnSendResetEmail = (Button) findViewById(R.id.sending_pass_reset_button);
    btnRemoveUser = (Button) findViewById(R.id.remove_user_button);
    changeEmail = (Button) findViewById(R.id.changeEmail);
    changePassword = (Button) findViewById(R.id.changePass);
    sendEmail = (Button) findViewById(R.id.send);
    remove = (Button) findViewById(R.id.remove);
    signOut = (Button) findViewById(R.id.sign_out);

    oldEmail = (EditText) findViewById(R.id.old_email);
    newEmail = (EditText) findViewById(R.id.new_email);
    password = (EditText) findViewById(R.id.password);
    newPassword = (EditText) findViewById(R.id.newPassword);

    oldEmail.setVisibility(View.GONE);
    newEmail.setVisibility(View.GONE);
    password.setVisibility(View.GONE);
    newPassword.setVisibility(View.GONE);
    changeEmail.setVisibility(View.GONE);
    changePassword.setVisibility(View.GONE);
    sendEmail.setVisibility(View.GONE);
    remove.setVisibility(View.GONE);

    progressBar = (ProgressBar) findViewById(R.id.progressBar);

    if (progressBar != null) {
        progressBar.setVisibility(View.GONE);
    }

    btnChangeEmail.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            oldEmail.setVisibility(View.GONE);
            newEmail.setVisibility(View.VISIBLE);
            password.setVisibility(View.GONE);
            newPassword.setVisibility(View.GONE);
            changeEmail.setVisibility(View.VISIBLE);
            changePassword.setVisibility(View.GONE);
            sendEmail.setVisibility(View.GONE);
            remove.setVisibility(View.GONE);
        }
    });

    changeEmail.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            progressBar.setVisibility(View.VISIBLE);
            if (user != null && !newEmail.getText().toString().trim().equals("")) {
                user.updateEmail(newEmail.getText().toString().trim())
                        .addOnCompleteListener(new OnCompleteListener<Void>() {
                            @Override
                            public void onComplete(@NonNull Task<Void> task) {
                                if (task.isSuccessful()) {
                                    Toast.makeText(MainActivity.this, "Email address is updated. Please sign in with new email id!", Toast.LENGTH_LONG).show();
                                    signOut();
                                    progressBar.setVisibility(View.GONE);
                                } else {
                                    Toast.makeText(MainActivity.this, "Failed to update email!", Toast.LENGTH_LONG).show();
                                    progressBar.setVisibility(View.GONE);
                                }
                            }
                        });
            } else if (newEmail.getText().toString().trim().equals("")) {
                newEmail.setError("Enter email");
                progressBar.setVisibility(View.GONE);
            }
        }
    });

    btnChangePassword.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            oldEmail.setVisibility(View.GONE);
            newEmail.setVisibility(View.GONE);
            password.setVisibility(View.GONE);
            newPassword.setVisibility(View.VISIBLE);
            changeEmail.setVisibility(View.GONE);
            changePassword.setVisibility(View.VISIBLE);
            sendEmail.setVisibility(View.GONE);
            remove.setVisibility(View.GONE);
        }
    });

    changePassword.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            progressBar.setVisibility(View.VISIBLE);
            if (user != null && !newPassword.getText().toString().trim().equals("")) {
                if (newPassword.getText().toString().trim().length() < 6) {
                    newPassword.setError("Password too short, enter minimum 6 characters");
                    progressBar.setVisibility(View.GONE);
                } else {
                    user.updatePassword(newPassword.getText().toString().trim())
                            .addOnCompleteListener(new OnCompleteListener<Void>() {
                                @Override
                                public void onComplete(@NonNull Task<Void> task) {
                                    if (task.isSuccessful()) {
                                        Toast.makeText(MainActivity.this, "Password is updated, sign in with new password!", Toast.LENGTH_SHORT).show();
                                        signOut();
                                        progressBar.setVisibility(View.GONE);
                                    } else {
                                        Toast.makeText(MainActivity.this, "Failed to update password!", Toast.LENGTH_SHORT).show();
                                        progressBar.setVisibility(View.GONE);
                                    }
                                }
                            });
                }
            } else if (newPassword.getText().toString().trim().equals("")) {
                newPassword.setError("Enter password");
                progressBar.setVisibility(View.GONE);
            }
        }
    });

    btnSendResetEmail.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            oldEmail.setVisibility(View.VISIBLE);
            newEmail.setVisibility(View.GONE);
            password.setVisibility(View.GONE);
            newPassword.setVisibility(View.GONE);
            changeEmail.setVisibility(View.GONE);
            changePassword.setVisibility(View.GONE);
            sendEmail.setVisibility(View.VISIBLE);
            remove.setVisibility(View.GONE);
        }
    });

    sendEmail.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            progressBar.setVisibility(View.VISIBLE);
            if (!oldEmail.getText().toString().trim().equals("")) {
                auth.sendPasswordResetEmail(oldEmail.getText().toString().trim())
                        .addOnCompleteListener(new OnCompleteListener<Void>() {
                            @Override
                            public void onComplete(@NonNull Task<Void> task) {
                                if (task.isSuccessful()) {
                                    Toast.makeText(MainActivity.this, "Reset password email is sent!", Toast.LENGTH_SHORT).show();
                                    progressBar.setVisibility(View.GONE);
                                } else {
                                    Toast.makeText(MainActivity.this, "Failed to send reset email!", Toast.LENGTH_SHORT).show();
                                    progressBar.setVisibility(View.GONE);
                                }
                            }
                        });
            } else {
                oldEmail.setError("Enter email");
                progressBar.setVisibility(View.GONE);
            }
        }
    });

    btnRemoveUser.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            progressBar.setVisibility(View.VISIBLE);
            if (user != null) {
                user.delete()
                        .addOnCompleteListener(new OnCompleteListener<Void>() {
                            @Override
                            public void onComplete(@NonNull Task<Void> task) {
                                if (task.isSuccessful()) {
                                    Toast.makeText(MainActivity.this, "Your profile is deleted:( Create a account now!", Toast.LENGTH_SHORT).show();
                                    startActivity(new Intent(MainActivity.this, SignupActivity.class));
                                    finish();
                                    progressBar.setVisibility(View.GONE);
                                } else {
                                    Toast.makeText(MainActivity.this, "Failed to delete your account!", Toast.LENGTH_SHORT).show();
                                    progressBar.setVisibility(View.GONE);
                                }
                            }
                        });
            }
        }
    });

    signOut.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            signOut();
        }
    });

}

//sign out method
public void signOut() {
    auth.signOut();
}

@Override
protected void onResume() {
    super.onResume();
    progressBar.setVisibility(View.GONE);
}

@Override
public void onStart() {
    super.onStart();
    auth.addAuthStateListener(authListener);
}

@Override
public void onStop() {
    super.onStop();
    if (authListener != null) {
        auth.removeAuthStateListener(authListener);
    }
}
}

图片:

!Check this]1

【问题讨论】:

    标签: android android-layout authentication firebase firebase-authentication


    【解决方案1】:

    如果你想强制你的图标溢出,你必须在你的菜单xml文件中添加app:showAsAction="never"到你的&lt;item&gt;标签。例如:

    <item
        app:showAsAction="never"
        android:title=""
        android:icon="@drawable/icon"
        android:id="@+id/icon"
        />
    

    如果您甚至没有菜单操作,请按照以下步骤操作:

    第 1 步:创建菜单 xml 右键单击​​您的 res 目录,选择新建>Android 资源目录。将资源名称设置为 menu 并为其添加名称。现在,如果尚未自动创建 menu.xml,请创建它,然后添加您需要的所有项目。例如,对于溢出菜单中的注销按钮:

        <?xml version="1.0" encoding="utf-8"?>
    <menu xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto">
    <item
        android:title="@string/logout"
        app:showAsAction="always"
        android:id="@+id/logout"
    
        />
    </menu>
    

    showAsIcon 属性设置为 `never' 使其始终显示在溢出中。

    第 2 步:膨胀并执行操作:覆盖 onCreateOptions 菜单,以便您可以创建菜单:

        @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        //Inflate the menu.xml you created:
        inflater.inflate(R.menu.menu_cno, menu);
        return super.onCreateOptionsMenu(menu);
    }
    

    第 3 步:设置回调:

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle item selection
        switch (item.getItemId()) {
            //The id of the <item> tag we created was logout, so, if the user clicks on an item with the id logout, we call on doWhateverYouWant(), in your case, doWhateverYouWant() is you logout method.
            case R.id.logout:
                doWhateverYouWant();
                break;
            default:
                return super.onOptionsItemSelected(item);
        }
        return false;
    
    }
    

    你已经完成了。

    【讨论】:

    • 谢谢!我已经到了某个地方:)但我仍然做的是一个退出的按钮点击事件我希望它是一个菜单点击事件,就像如果我点击注销它应该让我从溢出菜单本身注销,其中注销这只是 onOptionsSelection 的一个例子。
    • 当您添加menu.xml 并将其添加到onCreateOptionsMenu 中时,它应该已将图标添加到您的操作栏/工具栏。然后,在 onOptionsItemSelected 中,而不是 doWhateverYouWant,放入您的注销内容。
    • 如果你想要别的东西,那么请说得更清楚。
    猜你喜欢
    • 1970-01-01
    • 2017-12-19
    • 1970-01-01
    • 2021-05-26
    • 2021-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-21
    相关资源
    最近更新 更多