Android開発日記(4)パーソナルセンターサブアイテムレイアウト

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());
        }
    }
});

おすすめ

転載: blog.csdn.net/zzh2910/article/details/88856504