
{"id":501,"date":"2016-05-30T12:24:36","date_gmt":"2016-05-30T04:24:36","guid":{"rendered":"http:\/\/www.jiandaima.com\/blog\/?p=501"},"modified":"2016-11-06T22:13:34","modified_gmt":"2016-11-06T14:13:34","slug":"%e6%95%99%e4%bd%a0%e5%86%99%e4%b8%80%e4%b8%aa%e7%82%ab%e9%85%b7%e7%9a%84material-design-%e9%a3%8e%e6%a0%bc%e7%9a%84%e7%99%bb%e5%bd%95%e5%92%8c%e6%b3%a8%e5%86%8c%e9%a1%b5%e9%9d%a2","status":"publish","type":"post","link":"http:\/\/www.jiandaima.com\/blog\/archives\/501.html","title":{"rendered":"\u6559\u4f60\u5199\u4e00\u4e2a\u70ab\u9177\u7684Material Design \u98ce\u683c\u7684\u767b\u5f55\u548c\u6ce8\u518c\u9875\u9762"},"content":{"rendered":"<p>\u6bcf\u4e2a\u4eba\u90fd\u4f1a\u559c\u6b22\u6f02\u4eae\u7684\u767b\u5f55\u754c\u9762\uff0c\u4e00\u4e2aApp \u7ed9\u4eba\u4eec\u7684\u7b2c\u4e00\u5370\u8c61\u662f\u975e\u5e38\u91cd\u8981\u7684\u3002<\/p>\n<p>&nbsp;<\/p>\n<p>\u6bcf\u4e2a\u4eba\u90fd\u4f1a\u559c\u6b22\u6f02\u4eae\u7684\u767b\u5f55\u754c\u9762\uff0c\u4e00\u4e2aApp \u7ed9\u4eba\u4eec\u7684\u7b2c\u4e00\u5370\u8c61\u662f\u975e\u5e38\u91cd\u8981\u7684\u3002<\/p>\n<p>\u8fd9\u7bc7\u6587\u7ae0\u5c06\u6559\u4f60\u4f7f\u7528\u8c37\u6b4c\u6750\u6599\u8bbe\u8ba1\u89c4\u8303\uff08<a href=\"https:\/\/www.google.com\/design\/spec\/material-design\/introduction.html\">Material design spec<\/a> \uff09\u548c\u8c37\u6b4c\u7684\u65b0\u7684\u8bbe\u8ba1\u652f\u6301\u5e93\uff08 <a href=\"https:\/\/developer.android.com\/tools\/support-library\/index.html\">design support library<\/a>\uff09\u6765\u521b\u5efa\u4e00\u4e2a\u70ab\u9177\u7684\u767b\u5f55\u548c\u6ce8\u518c\u754c\u9762\u3002\u8bbe\u8ba1\u652f\u6301\u5e93\u5b9e\u73b0\u4e86\u6750\u6599\u8bbe\u8ba1\u89c4\u8303\u7684\u4e00\u90e8\u5206\uff0c\u5b83\u5305\u542b\u4e86\u4e00\u90e8\u5206\u70ab\u9177\u7684UI \u90e8\u4ef6\uff0c\u8ba9\u4f60\u7684<a class=\"replace_word\" title=\"undefined\" href=\"http:\/\/lib.csdn.net\/base\/15\" target=\"_blank\">Android<\/a> \u5e94\u7528\u7ed9\u4eba\u4e00\u79cd\u4f18\u96c5\u7684\u611f\u89c9\u3002<\/p>\n<p>\u5bf9\u4e8b\u7269\u7684\u8bbe\u8ba1\u548c\u5e03\u5c40\u65b9\u9762\uff0c\u5982\u4f55\u505a\u5230\u8ba9\u4eba\u611f\u89c9\u5230\u5c4f\u5e55\u4e0a\u7684\u5185\u5bb9\u662f\u8d4f\u5fc3\u60a6\u76ee\u7684\uff0c\u8fd9\u91cc\u662f\u6211\u4eec\u8981\u6743\u8861\u7684\u91cd\u70b9\uff0c\u6211\u4eec\u4f1a\u5728\u9876\u90e8\u72b6\u6001\u680f\u6dfb\u52a0\u7cbe\u7ec6\u7684\u89e6\u6478\u4e8b\u4ef6\uff0c\u5e76\u4f7f\u7528\u8bbe\u8ba1\u652f\u6301\u5e93\u7684<a href=\"http:\/\/www.google.com\/design\/spec\/components\/text-fields.html#text-fields-floating-labels\">floating labels<\/a> \uff08\u5b9e\u73b0\u81eaTextInputLayout\uff09\u3002<\/p>\n<p>\u51e0\u4e4e\u6240\u6709\u7684\u4e8b\u60c5\u90fd\u90fd\u5df2\u7ecf\u7167\u987e\u5230\u4f60\u3002<br \/>\n- \u5b8c\u6574\u7684\u4ee3\u7801\u548c\u6837\u4f8b\u6258\u7ba1\u5728Github<br \/>\n- \u5f53\u63a5\u53e3\u9501\u5b9a\u65f6\uff0c\u9632\u6b62\u540e\u9000\u6309\u94ae\u663e\u793a\u5728\u767b\u5f55Activity \u4e0a\u3002<br \/>\n- \u81ea\u5b9a\u4e49 <code>ProgressDialog<\/code>\u6765\u663e\u793a\u52a0\u8f7d\u7684\u72b6\u6001\u3002<br \/>\n- \u7b26\u5408\u6750\u6599\u8bbe\u8ba1\u89c4\u8303\u3002<br \/>\n- \u60ac\u6d6e\u6807\u7b7e\uff08<a href=\"http:\/\/www.google.com\/design\/spec\/components\/text-fields.html#text-fields-floating-labels\">floating labels<\/a>\uff09\uff08\u6765\u81ea\u8bbe\u8ba1\u652f\u6301\u5e93\uff09<br \/>\n- \u7528\u6237\u8868\u5355\u8f93\u5165\u6821\u9a8c<br \/>\n- \u81ea\u5b9a\u4e49\u72b6\u6001\u680f\u6837\u5f0f<br \/>\n- \u5728\u6bcf\u4e00\u4e2aActivity \u6d4b\u8bd5\u6a21\u4eff\u9a8c\u8bc1\u7684\u65b9\u6cd5\u3002<\/p>\n<p>\u5269\u4e0b\u7684\u5c31\u662f\u5b9e\u73b0\u81ea\u5df1\u7684\u8eab\u4efd\u9a8c\u8bc1\u903b\u8f91\u3002<\/p>\n<p><a href=\"https:\/\/github.com\/sourcey\/materiallogindemo\">\u83b7\u53d6\u6e90\u7801<\/a><\/p>\n<h2 id=\"\u767b\u5f55activity\"><a name=\"t0\"><\/a>\u767b\u5f55Activity<\/h2>\n<p>\u8ba9\u6211\u4eec\u6765\u8bbe\u7f6e\u767b\u5f55Activity\uff0c\u901a\u5e38\u662f\u5f00\u59cb\u4f60\u7684\u5e94\u7528\u7a0b\u5e8f\uff0c\u4f1a\u663e\u793a\u7ed9\u7528\u6237\u7684\u7b2c\u4e00\u4e2a\u8981\u542f\u52a8\u7684Activity\u3002<\/p>\n<p><a href=\"https:\/\/www.jiandaima.com\/blog\/wp-content\/uploads\/2016\/05\/screenshot-login.png\" class=\"highslide-image\" onclick=\"return hs.expand(this);\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/images.jiandaima.com\/blog\/wp-content\/uploads\/2016\/05\/screenshot-login-281x500.png?imageView2\/1\/w\/562\/h\/1000#\" alt=\"screenshot-login\" width=\"281\" height=\"500\" class=\"aligncenter size-large wp-image-581\" \/><\/a><\/p>\n<p>\u5982\u679c\u4f60\u60f3\u8981\u6dfb\u52a0\u793e\u4ea4\u767b\u5f55\u6309\u94ae\uff0c\u8bf7\u7ee7\u7eed\uff0c\u4f46\u662f\u5f53\u524d\u5728\u8fd9\u4e2a\u6587\u7ae0\u8303\u56f4\u5185\uff0c\u53ea\u7ed9\u4f60\u57fa\u672c\u7684\u4ee3\u7801\uff0c\u8ba9\u4f60\u6709\u4e00\u4e2a\u575a\u56fa\u7684\u8d77\u70b9\u53bb\u6784\u5efa\u4f60\u7684\u9a8c\u8bc1\u6d41\u7a0b\u3002<\/p>\n<p>\u9700\u8981\u6ce8\u610f\u7684\u662f <code>onBackPressed<\/code> \u65b9\u6cd5\u5c06\u4f1a\u88ab\u91cd\u5199\uff0c\u8fd9\u6837\u5c06\u4f1a\u9632\u6b62\u7528\u6237\u5173\u95ed\u767b\u5f55Activity\u3002<\/p>\n<p>&nbsp;<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\n\r\n\r\nLoginActivity.java\r\n\r\npackage com.sourcey.materiallogindemo;\r\n\r\nimport android.app.ProgressDialog;\r\nimport android.os.Bundle;\r\nimport android.support.v7.app.AppCompatActivity;\r\nimport android.util.Log;\r\n\r\nimport android.content.Intent;\r\nimport android.view.View;\r\nimport android.widget.Button;\r\nimport android.widget.EditText;\r\nimport android.widget.TextView;\r\nimport android.widget.Toast;\r\n\r\nimport butterknife.ButterKnife;\r\nimport butterknife.InjectView;\r\n\r\npublic class LoginActivity extends AppCompatActivity {\r\n    private static final String TAG = &quot;LoginActivity&quot;;\r\n    private static final int REQUEST_SIGNUP = 0;\r\n\r\n    @Bind(R.id.input_email) EditText _emailText;\r\n    @Bind(R.id.input_password) EditText _passwordText;\r\n    @Bind(R.id.btn_login) Button _loginButton;\r\n    @Bind(R.id.link_signup) TextView _signupLink;\r\n\r\n    @Override\r\n    public void onCreate(Bundle savedInstanceState) {\r\n        super.onCreate(savedInstanceState);\r\n        setContentView(R.layout.activity_login);\r\n        ButterKnife.inject(this);\r\n\r\n        _loginButton.setOnClickListener(new View.OnClickListener() {\r\n\r\n            @Override\r\n            public void onClick(View v) {\r\n                login();\r\n            }\r\n        });\r\n\r\n        _signupLink.setOnClickListener(new View.OnClickListener() {\r\n\r\n            @Override\r\n            public void onClick(View v) {\r\n                \/\/ Start the Signup activity\r\n                Intent intent = new Intent(getApplicationContext(), SignupActivity.class);\r\n                startActivityForResult(intent, REQUEST_SIGNUP);\r\n            }\r\n        });\r\n    }\r\n\r\n    public void login() {\r\n        Log.d(TAG, &quot;Login&quot;);\r\n\r\n        if (!validate()) {\r\n            onLoginFailed();\r\n            return;\r\n        }\r\n\r\n        _loginButton.setEnabled(false);\r\n\r\n        final ProgressDialog progressDialog = new ProgressDialog(LoginActivity.this,\r\n                R.style.AppTheme_Dark_Dialog);\r\n        progressDialog.setIndeterminate(true);\r\n        progressDialog.setMessage(&quot;Authenticating...&quot;);\r\n        progressDialog.show();\r\n\r\n        String email = _emailText.getText().toString();\r\n        String password = _passwordText.getText().toString();\r\n\r\n        \/\/ TODO: Implement your own authentication logic here.\r\n\r\n        new android.os.Handler().postDelayed(\r\n                new Runnable() {\r\n                    public void run() {\r\n                        \/\/ On complete call either onLoginSuccess or onLoginFailed\r\n                        onLoginSuccess();\r\n                        \/\/ onLoginFailed();\r\n                        progressDialog.dismiss();\r\n                    }\r\n                }, 3000);\r\n    }\r\n\r\n\r\n    @Override\r\n    protected void onActivityResult(int requestCode, int resultCode, Intent data) {\r\n        if (requestCode == REQUEST_SIGNUP) {\r\n            if (resultCode == RESULT_OK) {\r\n\r\n                \/\/ TODO: Implement successful signup logic here\r\n                \/\/ By default we just finish the Activity and log them in automatically\r\n                this.finish();\r\n            }\r\n        }\r\n    }\r\n\r\n    @Override\r\n    public void onBackPressed() {\r\n        \/\/ disable going back to the MainActivity\r\n        moveTaskToBack(true);\r\n    }\r\n\r\n    public void onLoginSuccess() {\r\n        _loginButton.setEnabled(true);\r\n        finish();\r\n    }\r\n\r\n    public void onLoginFailed() {\r\n        Toast.makeText(getBaseContext(), &quot;Login failed&quot;, Toast.LENGTH_LONG).show();\r\n\r\n        _loginButton.setEnabled(true);\r\n    }\r\n\r\n    public boolean validate() {\r\n        boolean valid = true;\r\n\r\n        String email = _emailText.getText().toString();\r\n        String password = _passwordText.getText().toString();\r\n\r\n        if (email.isEmpty() || !android.util.Patterns.EMAIL_ADDRESS.matcher(email).matches()) {\r\n            _emailText.setError(&quot;enter a valid email address&quot;);\r\n            valid = false;\r\n        } else {\r\n            _emailText.setError(null);\r\n        }\r\n\r\n        if (password.isEmpty() || password.length() &amp;amp;lt; 4 || password.length() &amp;amp;gt; 10) {\r\n            _passwordText.setError(&quot;between 4 and 10 alphanumeric characters&quot;);\r\n            valid = false;\r\n        } else {\r\n            _passwordText.setError(null);\r\n        }\r\n\r\n        return valid;\r\n    }\r\n}\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" src=\"http:\/\/sourcey.com\/beautiful-android-logn-and-signup-screens-with-material-design\/screenshot-login.png\" width=\"360\" height=\"640\" \/><\/p>\n<p>&nbsp;<\/p>\n<p>res\/layout\/activity_login.xml<\/p>\n<pre class=\"brush: xml; title: ; notranslate\" title=\"\">\r\n&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;\r\n&lt;ScrollView xmlns:android=&quot;http:\/\/schemas.android.com\/apk\/res\/android&quot;\r\n    android:layout_width=&quot;fill_parent&quot;\r\n    android:layout_height=&quot;fill_parent&quot;\r\n    android:fitsSystemWindows=&quot;true&quot;&gt;\r\n\r\n    &lt;LinearLayout\r\n        android:orientation=&quot;vertical&quot;\r\n        android:layout_width=&quot;match_parent&quot;\r\n        android:layout_height=&quot;wrap_content&quot;\r\n        android:paddingTop=&quot;56dp&quot;\r\n        android:paddingLeft=&quot;24dp&quot;\r\n        android:paddingRight=&quot;24dp&quot;&gt;\r\n\r\n        &lt;ImageView android:src=&quot;@drawable\/logo&quot;\r\n            android:layout_width=&quot;wrap_content&quot;\r\n            android:layout_height=&quot;72dp&quot;\r\n            android:layout_marginBottom=&quot;24dp&quot;\r\n            android:layout_gravity=&quot;center_horizontal&quot; \/&gt;\r\n\r\n        &lt;!-- Email Label --&gt;\r\n        &lt;android.support.design.widget.TextInputLayout\r\n            android:layout_width=&quot;match_parent&quot;\r\n            android:layout_height=&quot;wrap_content&quot;\r\n            android:layout_marginTop=&quot;8dp&quot;\r\n            android:layout_marginBottom=&quot;8dp&quot;&gt;\r\n            &lt;EditText android:id=&quot;@+id\/input_email&quot;\r\n                android:layout_width=&quot;match_parent&quot;\r\n                android:layout_height=&quot;wrap_content&quot;\r\n                android:inputType=&quot;textEmailAddress&quot;\r\n                android:hint=&quot;Email&quot; \/&gt;\r\n        &lt;\/android.support.design.widget.TextInputLayout&gt;\r\n\r\n        &lt;!-- Password Label --&gt;\r\n        &lt;android.support.design.widget.TextInputLayout\r\n            android:layout_width=&quot;match_parent&quot;\r\n            android:layout_height=&quot;wrap_content&quot;\r\n            android:layout_marginTop=&quot;8dp&quot;\r\n            android:layout_marginBottom=&quot;8dp&quot;&gt;\r\n            &lt;EditText android:id=&quot;@+id\/input_password&quot;\r\n                android:layout_width=&quot;match_parent&quot;\r\n                android:layout_height=&quot;wrap_content&quot;\r\n                android:inputType=&quot;textPassword&quot;\r\n                android:hint=&quot;Password&quot;\/&gt;\r\n        &lt;\/android.support.design.widget.TextInputLayout&gt;\r\n\r\n        &lt;android.support.v7.widget.AppCompatButton\r\n            android:id=&quot;@+id\/btn_login&quot;\r\n            android:layout_width=&quot;fill_parent&quot;\r\n            android:layout_height=&quot;wrap_content&quot;\r\n            android:layout_marginTop=&quot;24dp&quot;\r\n            android:layout_marginBottom=&quot;24dp&quot;\r\n            android:padding=&quot;12dp&quot;\r\n            android:text=&quot;Login&quot;\/&gt;\r\n\r\n        &lt;TextView android:id=&quot;@+id\/link_signup&quot;\r\n            android:layout_width=&quot;fill_parent&quot;\r\n            android:layout_height=&quot;wrap_content&quot;\r\n            android:layout_marginBottom=&quot;24dp&quot;\r\n            android:text=&quot;No account yet? Create one&quot;\r\n            android:gravity=&quot;center&quot;\r\n            android:textSize=&quot;16dip&quot;\/&gt;\r\n\r\n    &lt;\/LinearLayout&gt;\r\n&lt;\/ScrollView&gt;\r\n<\/pre>\n<p>\u6ce8\u518c Activity<\/p>\n<p>\u6ce8\u518cActivity \u53ef\u4ee5\u8ba9\u4f60\u5728App \u4e2d\u521b\u5efa\u4e00\u4e2a\u7528\u6237\uff0c\u901a\u5e38\u4f1a\u5728\u767b\u5f55Activity \u4e2d\u663e\u793a\uff08\u6ce8\u518c\u7684\uff09\u94fe\u63a5\u3002<br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" src=\"http:\/\/sourcey.com\/beautiful-android-logn-and-signup-screens-with-material-design\/screenshot-signup.png\" width=\"360\" height=\"640\" \/><\/p>\n<p>\u9700\u8981\u6ce8\u610f\u7684\u662f\u5f53\u7528\u6237\u6ce8\u518c\u6210\u529f\u65f6\u6211\u4eec\u4f1a\u8bbe\u7f6e\u4e00\u4e2a<code>RESULT_OK<\/code> \u7684\u7ed3\u679c\u503c\uff0c\u8fd9\u4e2a\u7ed3\u679c\u5c06\u4f1a\u5728\u767b\u5f55Activity \u4e2d\u7684 <code>onActivityResult<\/code> \u65b9\u6cd5\u4e2d\u8c03\u7528\uff0c\u5e76\u4e14\u786e\u5b9a\u6ce8\u518c\u6210\u529f\u662f\u5982\u4f55\u5904\u7406\u7684\u3002\u5f53\u524d\u903b\u8f91\u662f\u5f88\u7b80\u5355\u7684\uff0c\u5f53\u7528\u6237\u6ce8\u518c\u6210\u529f\u65f6\u6211\u4eec\u4f1a\u9a6c\u4e0a\u505a\u4e00\u4e2a\u8bb0\u5f55\u3002\u5f53\u7136\u4f60\u60f3\u8981\u5b9e\u73b0\u90ae\u7bb1\u9a8c\u8bc1\uff0c\u4f60\u9700\u8981\u81ea\u5df1\u6765\u5b9e\u73b0\u3002<\/p>\n<p>&nbsp;<\/p>\n<p>SignupActivity.java<\/p>\n<p>&nbsp;<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\n\r\n\r\npackage com.sourcey.materiallogindemo;\r\n\r\nimport android.app.ProgressDialog;\r\nimport android.os.Bundle;\r\nimport android.support.v7.app.AppCompatActivity;\r\nimport android.util.Log;\r\nimport android.view.View;\r\nimport android.widget.Button;\r\nimport android.widget.EditText;\r\nimport android.widget.TextView;\r\nimport android.widget.Toast;\r\n\r\nimport butterknife.ButterKnife;\r\nimport butterknife.InjectView;\r\n\r\npublic class SignupActivity extends AppCompatActivity {\r\n    private static final String TAG = &quot;SignupActivity&quot;;\r\n\r\n    @Bind(R.id.input_name) EditText _nameText;\r\n    @Bind(R.id.input_email) EditText _emailText;\r\n    @Bind(R.id.input_password) EditText _passwordText;\r\n    @Bind(R.id.btn_signup) Button _signupButton;\r\n    @Bind(R.id.link_login) TextView _loginLink;\r\n\r\n\r\n    @Override\r\n    public void onCreate(Bundle savedInstanceState) {\r\n        super.onCreate(savedInstanceState);\r\n        setContentView(R.layout.activity_signup);\r\n        ButterKnife.inject(this);\r\n\r\n        _signupButton.setOnClickListener(new View.OnClickListener() {\r\n            @Override\r\n            public void onClick(View v) {\r\n                signup();\r\n            }\r\n        });\r\n\r\n        _loginLink.setOnClickListener(new View.OnClickListener() {\r\n            @Override\r\n            public void onClick(View v) {\r\n                \/\/ Finish the registration screen and return to the Login activity\r\n                finish();\r\n            }\r\n        });\r\n    }\r\n\r\n    public void signup() {\r\n        Log.d(TAG, &quot;Signup&quot;);\r\n\r\n        if (!validate()) {\r\n            onSignupFailed();\r\n            return;\r\n        }\r\n\r\n        _signupButton.setEnabled(false);\r\n\r\n        final ProgressDialog progressDialog = new ProgressDialog(SignupActivity.this,\r\n                R.style.AppTheme_Dark_Dialog);\r\n        progressDialog.setIndeterminate(true);\r\n        progressDialog.setMessage(&quot;Creating Account...&quot;);\r\n        progressDialog.show();\r\n\r\n        String name = _nameText.getText().toString();\r\n        String email = _emailText.getText().toString();\r\n        String password = _passwordText.getText().toString();\r\n\r\n        \/\/ TODO: Implement your own signup logic here.\r\n\r\n        new android.os.Handler().postDelayed(\r\n                new Runnable() {\r\n                    public void run() {\r\n                        \/\/ On complete call either onSignupSuccess or onSignupFailed \r\n                        \/\/ depending on success\r\n                        onSignupSuccess();\r\n                        \/\/ onSignupFailed();\r\n                        progressDialog.dismiss();\r\n                    }\r\n                }, 3000);\r\n    }\r\n\r\n\r\n    public void onSignupSuccess() {\r\n        _signupButton.setEnabled(true);\r\n        setResult(RESULT_OK, null);\r\n        finish();\r\n    }\r\n\r\n    public void onSignupFailed() {\r\n        Toast.makeText(getBaseContext(), &quot;Login failed&quot;, Toast.LENGTH_LONG).show();\r\n\r\n        _signupButton.setEnabled(true);\r\n    }\r\n\r\n    public boolean validate() {\r\n        boolean valid = true;\r\n\r\n        String name = _nameText.getText().toString();\r\n        String email = _emailText.getText().toString();\r\n        String password = _passwordText.getText().toString();\r\n\r\n        if (name.isEmpty() || name.length() &lt; 3) {\r\n            _nameText.setError(&quot;at least 3 characters&quot;);\r\n            valid = false;\r\n        } else {\r\n            _nameText.setError(null);\r\n        }\r\n\r\n        if (email.isEmpty() || !android.util.Patterns.EMAIL_ADDRESS.matcher(email).matches()) {\r\n            _emailText.setError(&quot;enter a valid email address&quot;);\r\n            valid = false;\r\n        } else {\r\n            _emailText.setError(null);\r\n        }\r\n\r\n        if (password.isEmpty() || password.length() &lt; 4 || password.length() &gt; 10) {\r\n            _passwordText.setError(&quot;between 4 and 10 alphanumeric characters&quot;);\r\n            valid = false;\r\n        } else {\r\n            _passwordText.setError(null);\r\n        }\r\n\r\n        return valid;\r\n    }\r\n}\r\n\r\n<\/pre>\n<p>res\/layout\/activity_signup.xml<\/p>\n<pre class=\"brush: xml; title: ; notranslate\" title=\"\">\r\n&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;\r\n&lt;ScrollView\r\n    xmlns:android=&quot;http:\/\/schemas.android.com\/apk\/res\/android&quot;\r\n    android:layout_width=&quot;fill_parent&quot;\r\n    android:layout_height=&quot;fill_parent&quot;\r\n    android:fitsSystemWindows=&quot;true&quot;&gt;\r\n\r\n    &lt;LinearLayout\r\n        android:orientation=&quot;vertical&quot;\r\n        android:layout_width=&quot;match_parent&quot;\r\n        android:layout_height=&quot;wrap_content&quot;\r\n        android:paddingTop=&quot;56dp&quot;\r\n        android:paddingLeft=&quot;24dp&quot;\r\n        android:paddingRight=&quot;24dp&quot;&gt;\r\n\r\n        &lt;ImageView android:src=&quot;@drawable\/logo&quot;\r\n            android:layout_width=&quot;wrap_content&quot;\r\n            android:layout_height=&quot;72dp&quot;\r\n            android:layout_marginBottom=&quot;24dp&quot;\r\n            android:layout_gravity=&quot;center_horizontal&quot; \/&gt;\r\n\r\n        &lt;!--  Name Label --&gt;\r\n        &lt;android.support.design.widget.TextInputLayout\r\n            android:layout_width=&quot;match_parent&quot;\r\n            android:layout_height=&quot;wrap_content&quot;\r\n            android:layout_marginTop=&quot;8dp&quot;\r\n            android:layout_marginBottom=&quot;8dp&quot;&gt;\r\n            &lt;EditText android:id=&quot;@+id\/input_name&quot;\r\n                android:layout_width=&quot;match_parent&quot;\r\n                android:layout_height=&quot;wrap_content&quot;\r\n                android:inputType=&quot;textCapWords&quot;\r\n                android:hint=&quot;Name&quot; \/&gt;\r\n        &lt;\/android.support.design.widget.TextInputLayout&gt;\r\n\r\n        &lt;!-- Email Label --&gt;\r\n        &lt;android.support.design.widget.TextInputLayout\r\n            android:layout_width=&quot;match_parent&quot;\r\n            android:layout_height=&quot;wrap_content&quot;\r\n            android:layout_marginTop=&quot;8dp&quot;\r\n            android:layout_marginBottom=&quot;8dp&quot;&gt;\r\n            &lt;EditText android:id=&quot;@+id\/input_email&quot;\r\n                android:layout_width=&quot;match_parent&quot;\r\n                android:layout_height=&quot;wrap_content&quot;\r\n                android:inputType=&quot;textEmailAddress&quot;\r\n                android:hint=&quot;Email&quot; \/&gt;\r\n        &lt;\/android.support.design.widget.TextInputLayout&gt;\r\n\r\n        &lt;!-- Password Label --&gt;\r\n        &lt;android.support.design.widget.TextInputLayout\r\n            android:layout_width=&quot;match_parent&quot;\r\n            android:layout_height=&quot;wrap_content&quot;\r\n            android:layout_marginTop=&quot;8dp&quot;\r\n            android:layout_marginBottom=&quot;8dp&quot;&gt;\r\n            &lt;EditText android:id=&quot;@+id\/input_password&quot;\r\n                android:layout_width=&quot;match_parent&quot;\r\n                android:layout_height=&quot;wrap_content&quot;\r\n                android:inputType=&quot;textPassword&quot;\r\n                android:hint=&quot;Password&quot;\/&gt;\r\n        &lt;\/android.support.design.widget.TextInputLayout&gt;\r\n\r\n        &lt;!-- Signup Button --&gt;\r\n        &lt;android.support.v7.widget.AppCompatButton\r\n            android:id=&quot;@+id\/btn_signup&quot;\r\n            android:layout_width=&quot;fill_parent&quot;\r\n            android:layout_height=&quot;wrap_content&quot;\r\n            android:layout_marginTop=&quot;24dp&quot;\r\n            android:layout_marginBottom=&quot;24dp&quot;\r\n            android:padding=&quot;12dp&quot;\r\n            android:text=&quot;Create Account&quot;\/&gt;\r\n\r\n        &lt;TextView android:id=&quot;@+id\/link_login&quot;\r\n            android:layout_width=&quot;fill_parent&quot;\r\n            android:layout_height=&quot;wrap_content&quot;\r\n            android:layout_marginBottom=&quot;24dp&quot;\r\n            android:text=&quot;Already a member? Login&quot;\r\n            android:gravity=&quot;center&quot;\r\n            android:textSize=&quot;16dip&quot;\/&gt;\r\n\r\n    &lt;\/LinearLayout&gt;\r\n&lt;\/ScrollView&gt;\r\n<\/pre>\n<p><strong>\u914d\u7f6e<\/strong><\/p>\n<p>\u4e3a\u4e86\u8ba9\u7a0b\u5e8f\u4e00\u5207\u6b63\u5e38\u5de5\u4f5c\uff0c\u6211\u4eec\u5728\u9700\u8981\u5728 app \u76ee\u5f55\u4e0b\u7684 build.gradle \u4e2d\u6dfb\u52a0\u4e00\u4e9b\u4f9d\u8d56\uff0cButterKnife \u662f\u53ef\u9009\u7684\uff0c\u5f53\u7136\u6211\u4eec\u66f4\u559c\u6b22\u7528\u5b83\u8ba9\u6211\u4eec\u7684Java \u4ee3\u7801\u66f4\u52a0\u6574\u6d01\u4e00\u4e9b\u3002<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\ndependencies {\r\n    compile fileTree(dir: 'libs', include: &#x5B;'*.jar'])\r\n    compile 'com.android.support:appcompat-v7:22.2.0'\r\n    compile 'com.android.support:design:22.2.0'\r\n    compile 'com.jakewharton:butterknife:7.0.1'\r\n}\r\n<\/pre>\n<p>\u8fd8\u6709\u4e00\u4e2a\u6211\u4eec\u5fc5\u987b\u8981\u5728AndroidManifest \u4e2d\u6dfb\u52a0\u58f0\u660eActivity\u3002\u6211\u5df2\u7ecf\u628aAndroidManifest \u6e05\u6670\u5b8c\u6574\u7684\u4ee3\u7801\u8d34\u4e86\u51fa\u6765\u3002<\/p>\n<pre class=\"brush: xml; title: ; notranslate\" title=\"\">\r\n&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;\r\n&lt;manifest xmlns:android=&quot;http:\/\/schemas.android.com\/apk\/res\/android&quot;\r\n    package=&quot;com.sourcey.materiallogindemo&quot; &gt;\r\n\r\n    &lt;uses-permission android:name=&quot;android.permission.INTERNET&quot; \/&gt;\r\n\r\n    &lt;application\r\n        android:allowBackup=&quot;true&quot;\r\n        android:icon=&quot;@mipmap\/ic_launcher&quot;\r\n        android:label=&quot;@string\/app_name&quot;\r\n        android:theme=&quot;@style\/AppTheme&quot; &gt;\r\n        &lt;activity\r\n            android:name=&quot;.MainActivity&quot;\r\n            android:label=&quot;@string\/app_name&quot; &gt;\r\n            &lt;intent-filter&gt;\r\n                &lt;action android:name=&quot;android.intent.action.MAIN&quot; \/&gt;\r\n\r\n                &lt;category android:name=&quot;android.intent.category.LAUNCHER&quot; \/&gt;\r\n            &lt;\/intent-filter&gt;\r\n        &lt;\/activity&gt;\r\n        &lt;activity android:name=&quot;.LoginActivity&quot; android:theme=&quot;@style\/AppTheme.Dark&quot; \/&gt;\r\n        &lt;activity android:name=&quot;.SignupActivity&quot; android:theme=&quot;@style\/AppTheme.Dark&quot; \/&gt;\r\n    &lt;\/application&gt;\r\n\r\n&lt;\/manifest&gt;\r\n<\/pre>\n<p>\u5e0c\u671b\u8fd9\u7bc7\u6587\u7ae0\u5bf9\u4f60\u662f\u6709\u5e2e\u52a9\u7684\uff0c\u5982\u679c\u8fd9\u7bc7\u6587\u7ae0\u771f\u7684\u8282\u7ea6\u4f60\u5b9d\u8d35\u7684\u5f00\u53d1\u65f6\u95f4\uff0c\u8bf7\u7ed9\u6211\u7559\u8a00\u3002<\/p>\n","raw":"","protected":false},"excerpt":{"rendered":"<p>\u6559\u4f60\u5199\u4e00\u4e2a\u70ab\u9177\u7684Material Design \u98ce\u683c\u7684\u767b\u5f55\u548c\u6ce8\u518c\u9875\u9762,\u8fd9\u7bc7\u6587\u7ae0\u5c06\u6559\u4f60\u4f7f\u7528\u8c37\u6b4c\u6750\u6599\u8bbe\u8ba1\u89c4\u8303\uff08Material design spec \uff09\u548c\u8c37\u6b4c\u7684\u65b0\u7684\u8bbe\u8ba1\u652f\u6301\u5e93\uff08 design support library\uff09\u6765\u521b\u5efa\u4e00\u4e2a\u70ab\u9177\u7684\u767b\u5f55\u548c\u6ce8\u518c\u754c\u9762\u3002\u8bbe\u8ba1\u652f\u6301\u5e93\u5b9e\u73b0\u4e86\u6750\u6599\u8bbe\u8ba1\u89c4\u8303\u7684\u4e00\u90e8\u5206\uff0c\u5b83\u5305\u542b\u4e86\u4e00\u90e8\u5206\u70ab\u9177\u7684UI \u90e8\u4ef6\uff0c\u8ba9\u4f60\u7684Android \u5e94\u7528\u7ed9\u4eba\u4e00\u79cd\u4f18\u96c5\u7684\u611f\u89c9\u3002\u5b89\u5353iOS\u6bd5\u8bbe\u6e90\u7801\u4e0b\u8f7d<\/p>\n","protected":false},"author":1,"featured_media":522,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[1],"tags":[18,141,142],"class_list":["post-501","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized","tag-android","tag-ios","tag-142"],"post_thumbnail_image":"http:\/\/images.jiandaima.com\/blog\/wp-content\/uploads\/2016\/05\/64022-3.png?imageView2\/1\/w\/300\/h\/300#","content_first_image":"http:\/\/images.jiandaima.com\/blog\/wp-content\/uploads\/2016\/05\/screenshot-login.png","post_medium_image_300":"http:\/\/images.jiandaima.com\/blog\/wp-content\/uploads\/2016\/05\/64022-3.png?imageView2\/1\/w\/600\/h\/356#","post_thumbnail_image_624":"http:\/\/images.jiandaima.com\/blog\/wp-content\/uploads\/2016\/05\/64022-3.png","post_frist_image":"http:\/\/images.jiandaima.com\/blog\/wp-content\/uploads\/2016\/05\/screenshot-login.png","post_medium_image":"http:\/\/images.jiandaima.com\/blog\/wp-content\/uploads\/2016\/05\/64022-3.png?imageView2\/1\/w\/600\/h\/356#","post_large_image":"http:\/\/images.jiandaima.com\/blog\/wp-content\/uploads\/2016\/05\/64022-3.png","post_full_image":"http:\/\/images.jiandaima.com\/blog\/wp-content\/uploads\/2016\/05\/64022-3.png","post_all_images":[{"imagesurl":"http:\/\/images.jiandaima.com\/blog\/wp-content\/uploads\/2016\/05\/screenshot-login-281x500.png?imageView2\/1\/w\/562\/h\/1000#","id":"image0"},{"imagesurl":"http:\/\/sourcey.com\/beautiful-android-logn-and-signup-screens-with-material-design\/screenshot-login.png","id":"image1"},{"imagesurl":"http:\/\/sourcey.com\/beautiful-android-logn-and-signup-screens-with-material-design\/screenshot-signup.png","id":"image2"}],"videoAdId":"","listAd":"0","listAdId":"","listAdEvery":5,"total_comments":0,"category_name":"\u6e90\u7801\u5206\u4eab\u516c\u544a","post_date":"2016-05-30","like_count":"0","praiseWord":"\u9f13\u52b1","copyright_state":"","excitationAd":"0","rewardedVideoAdId":"","detailAdId":"","detailAd":"0","enterpriseMinapp":"0","audios":[],"postImageUrl":"http:\/\/images.jiandaima.com\/blog\/wp-content\/uploads\/2020\/02\/img_5e44112722964.png","avatarurls":[],"related_posts":[],"pageviews":553,"next_post_id":872,"next_post_title":"Android \u6c89\u6d78\u5f0f\u72b6\u6001\u680f\u53ca\u60ac\u6d6e\u6548\u679c,\u6e90\u7801\u4e0b\u8f7d\u3002","previous_post_id":98,"previous_post_title":"2016\u5e74\u4e00\u5efa\u548c\u4e8c\u5efa\u8003\u8bd5\u57f9\u8bad\u89c6\u9891\u8bfe\u7a0b-\u514d\u8d39\u4e0b\u8f7d","_links":{"self":[{"href":"http:\/\/www.jiandaima.com\/blog\/wp-json\/wp\/v2\/posts\/501","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/www.jiandaima.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.jiandaima.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.jiandaima.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.jiandaima.com\/blog\/wp-json\/wp\/v2\/comments?post=501"}],"version-history":[{"count":0,"href":"http:\/\/www.jiandaima.com\/blog\/wp-json\/wp\/v2\/posts\/501\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"http:\/\/www.jiandaima.com\/blog\/wp-json\/wp\/v2\/media\/522"}],"wp:attachment":[{"href":"http:\/\/www.jiandaima.com\/blog\/wp-json\/wp\/v2\/media?parent=501"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.jiandaima.com\/blog\/wp-json\/wp\/v2\/categories?post=501"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.jiandaima.com\/blog\/wp-json\/wp\/v2\/tags?post=501"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}