1.ニックネームを変更する
ニックネームを変更するためのインターフェースは非常にシンプルです。1行の入力ボックスと完全なボタンがあります。シンプルですがデザインが良くありません。ティムの...
だから...
このインターフェースを見るまで満足のいくインターフェースを得ることができません。他のインターフェースと同様に、本当に快適です。このスタイルを使用してください...
当時、Androidのデフォルトの背景色を見つけるのに大変な労力を要しました。まず、?attr /でwindowBackgroundを探しましたが、見つかりませんでした。次に、カラーピッカーを使用しましたが、常にギャップがありました。 。最後に、私はこの色がであることがわかった?アンドロイド:windowBackground内部
このアクティビティのロジックは非常に単純です。[完了]ボタンをクリックすると、入力ボックスの内容を取得して有効性を判断し、サーバーに送信してユーザーのニックネームを更新します。更新が成功したら、ローカルのSharedPreferenceのコンテンツ。それ以外の場合は、エラーメッセージが表示され、前のアクティビティに戻ります。
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()){
case android.R.id.home:
finish();
return true;
case R.id.finish:
final String nameInput = input.getText().toString();
if (nameInput.equals("")){
Toast.makeText(SetUserNameActivity.this, "用户名不能为空", Toast.LENGTH_SHORT).show();
}
else {
Request request = new Request.Builder().url("http://www.baidu.com").build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Request request, IOException e) {
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(SetUserNameActivity.this, "网络异常", Toast.LENGTH_SHORT).show();
}
});
}
@Override
public void onResponse(Response response) throws IOException {
SharedPreferences.Editor editor = spf.edit();
editor.putString("name", nameInput);
editor.apply();
finish();
}
});
}
}
return true;
}
2、パスワードを変更します
パスワード変更のインターフェースレイアウトは非常にシンプルです。元のパスワード、新しいパスワード、確認パスワードを入力するための3つの入力ボックスが用意されています。パスワード
の更新プロセスはニックネームの更新と同じです。有効性が判断された後、統一された方法でサーバーに送信できます。ここで対処する主な問題は、変更が成功した後、ログインステータスをクリアしてログインインターフェイスに戻す必要があることです。これには、コレクタークラスを使用してすべての活動を管理する
public class ActivityCollector {
public static List<Activity> activities = new ArrayList<>();
public static void addActivity(Activity activity){
activities.add(activity);
}
public static void removeActivity(Activity activity){
activities.remove(activity);
}
public static void finishAll(){
for (Activity activity: activities){
if (!activity.isFinishing()){
activity.finish();
}
}
}
}
次に、BaseActivityをすべてのアクティビティの親クラスとして定義します。BaseActivityは、それを継承するすべてのサブクラスがコレクターリストに追加されます。AppCompatActivityを継承するため、このような継承に問題はありません。
public class BaseActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActivityCollector.addActivity(this);
}
@Override
protected void onDestroy() {
super.onDestroy();
ActivityCollector.removeActivity(this);
}
}
このように、パスワード検証に合格した後は、ローカルのSharedPreferenceコンテンツをクリアしてから、アクティビティリストをクリアし、最後にログインアクティビティを開始するだけです。モジュールはまだマージされていないため、最初にメインインターフェイスを開始します。
SharedPreferences.Editor editor = spf.edit();
editor.clear();
editor.apply();
ActivityCollector.finishAll();
Intent intent = new Intent(SetUserPasswordActivity.this, MainActivity.class);
startActivity(intent);
3.携帯電話番号/メールアドレスを変更します
これらの2つのインターフェースは、表示コンテンツとリクエストサーバーアドレスを除いてまったく同じです。1つのアクティビティにマージできますが、開発中に別々に作成され、時間があるときに後でマージされます。携帯電話番号を取得してください。例として変更を行い、2つのアクティビティを作成します。最初のアクティビティは現在のバインディングステータスを表示するために使用され、確認後、変更する2番目のアクティビティを入力します
- 検証コードを取得した後のカウントダウン
AndroidはタイマークラスCountDownTimerを提供します。それを継承する内部クラスを定義してから、必要な関数を実装する必要があります。
//倒计时
private class MyCountDownTimer extends CountDownTimer {
public MyCountDownTimer(long millisInFuture, long countDownInterval) {
super(millisInFuture, countDownInterval);
}
//计时过程
@Override
public void onTick(long l) {
//防止计时过程中重复点击
btGet.setClickable(false);
btGet.setBackgroundColor(Color.parseColor("#bfbfbf"));
btGet.setText(l/1000+"秒");
}
//计时完毕的方法
@Override
public void onFinish() {
//重新给Button设置文字
btGet.setText("重新获取");
//设置可点击
btGet.setClickable(true);
}
}
このセクションの送信確認コードはサーバー側に配置する必要がありますが、最初にテキストメッセージを送信するためにmobプラットフォームでデータをテストする必要があります。今回は、ログイン登録弟がすでに良いmobを登録している可能性があり、直接取得します。
プロジェクトのbuild.gradleのAddの最初のIDとの彼のアイデンティティ
...
repositories {
...
maven {
url "http://mvn.mob.com/android"
}
}
dependencies {
...
classpath 'com.mob.sdk:MobSDK:+'
}
...
次に、アプリのbuild.gradleを追加します
apply plugin: "com.mob.sdk"
MobSDK{
appkey "自己的key"
appSecret "自己的Secret"
SMSSDK{
gui false //不用SMSSDK中自带的UI
}
}
確認コードを送信するコードはまだ非常に単純です、
//new倒计时对象,总共的时间,每隔多少秒更新一次时间
final BindPhoneActivity.MyCountDownTimer myCountDownTimer = new BindPhoneActivity.MyCountDownTimer(60000,1000);
//获取验证码按钮点击
btGet.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
phoneInput = phone.getText().toString();
if (phone.length() != 11) Toast.makeText(BindPhoneActivity.this, "手机号码格式不正确", Toast.LENGTH_SHORT).show();
else {
SMSSDK.getVerificationCode("+86", phoneInput); // 发送验证码
/**
* 初始化接收器, 接收验证结果
*/
eventHandler = new EventHandler() {
public void afterEvent(int event, int result, Object data) {
// afterEvent会在子线程被调用,因此如果后续有UI相关操作,需要将数据发送到UI线程
Message msg = new Message();
msg.arg1 = event;
msg.arg2 = result;
msg.obj = data;
new Handler(Looper.getMainLooper(), new Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {
int event = msg.arg1;
int result = msg.arg2;
Object data = msg.obj;
if (event == SMSSDK.EVENT_GET_VERIFICATION_CODE) {
if (result == SMSSDK.RESULT_COMPLETE) {
// TODO 处理成功得到验证码的结果
} else {
// TODO 处理错误的结果
Toast.makeText(BindPhoneActivity.this, "服务器异常", Toast.LENGTH_SHORT).show();
}
} else if (event == SMSSDK.EVENT_SUBMIT_VERIFICATION_CODE) {
if (result == SMSSDK.RESULT_COMPLETE) {
// TODO 处理验证码验证通过的结果
SharedPreferences.Editor editor = spf.edit();
editor.putString("phone", phoneInput);
editor.apply();
finish();
} else {
// TODO 处理错误的结果
Toast.makeText(BindPhoneActivity.this, "验证码错误", Toast.LENGTH_SHORT).show();
}
}
// TODO 其他接口的返回结果也类似,根据event判断当前数据属于哪个接口
return false;
}
}).sendMessage(msg);
}
};
SMSSDK.registerEventHandler(eventHandler);
btFinish.setVisibility(View.VISIBLE);
myCountDownTimer.start();
}
}
});
// 确认按钮点击时发送到mob进行校验
btFinish.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String codeInput = code.getText().toString();
if (!codeInput.equals("")) {
SMSSDK.submitVerificationCode("+86", phoneInput, code.getText().toString());
}
}
});