Android Studioが作成したLoginActivity分析
8099 ワード
今日からAndroidの知識の勉強を記録しましょう.
ASで生成されたLoginActivityのレイアウトが簡潔で、少し修正すれば良いという感じなので、このActivityのコードを勉強してみましょう.
まずレイアウトファイル
メンバー変数
DUMMY_CREDENTTALSは既存のアカウントをシミュレートするために使用され、コロンは前がアカウント、コロン後がパスワードmAuthTaskはUserLoginTaskの例であり、UserLoginTaskはAsyncTaskから継承され、後でこの用途について説明する
そしてonCreateメソッド
メソッド最後の2つのmLoginFormViewとmProgressViewは、表示されているViewを取得するために使用され、ログイン時にログインウィンドウgone,ProgressBar visibleの操作を行うことができます.
もう1つはAutoCompleteEditTextの後にあるpopulateAutoComplete()メソッドで、メソッド名で見ると自動補完リストを構築し、フォローアップします
まずmayRequestContactsで実行を継続するか否かを判断し,判断するとLoadersを初期化し,Loadersバックグラウンドでユーザのアカウント情報を非同期で読み出す.
mayRequestContacts()を見てみると、コードは次の通りです.
次にbuttonのクリックイベントとEditTextのリターンイベントでattemptLogin()メソッドが見つかり、このメソッドは主に入力したアカウントパスワードの合法性(空か、長さが小さすぎるか)を初歩的に判断し、エラーメッセージを与える.初歩的な検査を経て、ログインボックスとボタンを隠し、進捗バーを表示し、AsyncTaskでバックグラウンドログインを行います.このAsyncTaskは上の変数のmAuthTaskで、使用するときにdoInBackgroundメソッドを書き換えて自分のビジネスロジックを実現します.
これらがLoginActivityの主なコード理解です.
ASで生成されたLoginActivityのレイアウトが簡潔で、少し修正すれば良いという感じなので、このActivityのコードを勉強してみましょう.
まずレイアウトファイル
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_horizontal"
android:orientation="vertical"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.dc.activity.LoginActivity">
<!-- Login progress -->
<ProgressBar
android:id="@+id/login_progress"
style="?android:attr/progressBarStyleLarge"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:visibility="gone"/>
<ScrollView
android:id="@+id/login_form"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:id="@+id/email_login_form"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<android.support.design.widget.TextInputLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<AutoCompleteTextView
android:id="@+id/account"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/prompt_account"
android:inputType="textEmailAddress"
android:maxLines="1"
android:singleLine="true"/>
</android.support.design.widget.TextInputLayout>
<android.support.design.widget.TextInputLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<EditText
android:id="@+id/password"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/prompt_password"
android:imeActionId="@+id/login"
android:imeActionLabel="@string/action_sign_in_short"
android:imeOptions="actionUnspecified"
android:inputType="textPassword"
android:maxLines="1"
android:singleLine="true"/>
</android.support.design.widget.TextInputLayout>
<Button
android:id="@+id/email_sign_in_button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:text="@string/action_sign_in"
android:textStyle="bold"/>
</LinearLayout>
</ScrollView>
</LinearLayout>
LinearLayoutの下にはgoneのProgressBarと1つのScrollView、ScrollViewの下に2つのTextInputLayoutと1つのButtonがネストされています.シンプルなインターフェースで、必要に応じてToolbarを加えることができます.メンバー変数
/**
* Id to identity READ_CONTACTS permission request.
*/
private static final int REQUEST_READ_CONTACTS = 0;
/**
* A dummy authentication store containing known user names and passwords.
* TODO: remove after connecting to a real authentication system.
*/
private static final String[] DUMMY_CREDENTIALS = new String[]{
"[email protected]:hello", "[email protected]:world"
};
/**
* Keep track of the login task to ensure we can cancel it if requested.
*/
private UserLoginTask mAuthTask = null;
// UI references.
private AutoCompleteTextView accountView;
private EditText mPasswordView;
private View mProgressView;
private View mLoginFormView;
DUMMY_CREDENTTALSは既存のアカウントをシミュレートするために使用され、コロンは前がアカウント、コロン後がパスワードmAuthTaskはUserLoginTaskの例であり、UserLoginTaskはAsyncTaskから継承され、後でこの用途について説明する
そしてonCreateメソッド
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
// Set up the login form.
accountView = (AutoCompleteTextView) findViewById(R.id.account);
populateAutoComplete();
mPasswordView = (EditText) findViewById(R.id.password);
mPasswordView.setOnEditorActionListener(new TextView.OnEditorActionListener()
{
@Override
public boolean onEditorAction(TextView textView, int id, KeyEvent keyEvent)
{
if (id == R.id.login || id == EditorInfo.IME_NULL) {
attemptLogin();
return true;
}
return false;
}
});
Button mEmailSignInButton = (Button) findViewById(R.id.sign_in_button);
mEmailSignInButton.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View view)
{
attemptLogin();
}
});
mLoginFormView = findViewById(R.id.login_form);
mProgressView = findViewById(R.id.login_progress);
}
onCreateメソッドでは主にViewの初期化といくつかのリスニングイベントの設定が行われており、EditViewが設定したonEditorActionはリターンを押すと実行されます.メソッド最後の2つのmLoginFormViewとmProgressViewは、表示されているViewを取得するために使用され、ログイン時にログインウィンドウgone,ProgressBar visibleの操作を行うことができます.
もう1つはAutoCompleteEditTextの後にあるpopulateAutoComplete()メソッドで、メソッド名で見ると自動補完リストを構築し、フォローアップします
private void populateAutoComplete()
{
if (!mayRequestContacts()) {
return;
}
getLoaderManager().initLoader(0, null, this);
}
まずmayRequestContactsで実行を継続するか否かを判断し,判断するとLoadersを初期化し,Loadersバックグラウンドでユーザのアカウント情報を非同期で読み出す.
mayRequestContacts()を見てみると、コードは次の通りです.
private boolean mayRequestContacts()
{
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
return true;
}
if (checkSelfPermission(READ_CONTACTS) == PackageManager.PERMISSION_GRANTED) {
return true;
}
if (shouldShowRequestPermissionRationale(READ_CONTACTS)) {
Snackbar.make(accountView, R.string.permission_rationale, Snackbar.LENGTH_INDEFINITE)
.setAction(android.R.string.ok, new View.OnClickListener()
{
@Override
@TargetApi(Build.VERSION_CODES.M)
public void onClick(View v)
{
requestPermissions(new String[]{READ_CONTACTS}, REQUEST_READ_CONTACTS);
}
});
} else {
requestPermissions(new String[]{READ_CONTACTS}, REQUEST_READ_CONTACTS);
}
return false;
}
から、この方法は、主に6.0の新しい権限メカニズムを適合させるためにユーザにアカウントの読み取り権限を取得するように要求するために使用されることがわかる.次にbuttonのクリックイベントとEditTextのリターンイベントでattemptLogin()メソッドが見つかり、このメソッドは主に入力したアカウントパスワードの合法性(空か、長さが小さすぎるか)を初歩的に判断し、エラーメッセージを与える.初歩的な検査を経て、ログインボックスとボタンを隠し、進捗バーを表示し、AsyncTaskでバックグラウンドログインを行います.このAsyncTaskは上の変数のmAuthTaskで、使用するときにdoInBackgroundメソッドを書き換えて自分のビジネスロジックを実現します.
これらがLoginActivityの主なコード理解です.