在日常的開發中我們經常直接使用xml對介面進行布局,但是使用這種布局方式就直接把布局寫死了,不能靈活的進行頁面元素的展示,比如根據從伺服器中請求Json資料的不同進行動態顯示配置樣式,額,當然使用的頻率也不算太高,當然,對於一名合格的程式員當然要掌握任何一種開發中能夠使用到的技能。
這次我們通過實現一個簡單的登陸頁面,來學習一下Android中使用代碼進行布局並記錄下涉及到的知識點。
下面看一下啟動並執行實際效果:
先貼上本次項目的實際代碼,後面進行詳細說明:
/** * 使用代碼進行登入介面的布局 * @author wangke */public class CodeLayoutActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //建立一個最外層的根布局 LinearLayout rootLayout = new LinearLayout(this); rootLayout.setBackgroundColor(Color.CYAN); //設定線性布局中子View的擺放為豎直方向 rootLayout.setOrientation(LinearLayout.VERTICAL); //建立一個根部局的LayoutParams LinearLayout.LayoutParams rootParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); //設定根部局的Margin值 rootParams.setMargins(DensityUtil.dip2px(this,5),DensityUtil.dip2px(this,5),DensityUtil.dip2px(this,5),DensityUtil.dip2px(this,5)); rootParams.gravity = Gravity.CENTER_HORIZONTAL; rootLayout.setLayoutParams(rootParams); //設定最外層根部局布局的背景顏色 rootLayout.setBackgroundColor(Color.CYAN); //將當前建立的根部局設定給Activity setContentView(rootLayout); //建立一個顯示帳戶圖片的ImageView ImageView ivIco = new ImageView(this); ivIco.setImageResource(R.drawable.ico); //將建立的用於顯示頭像的ImageView添加到最外層的線性布局中 rootLayout.addView(ivIco); //當通過子View進行擷取所在的布局的時候,rootLayout.addView(ivIco)需要寫在前面,原因想起來也很清楚,當前的ImageView都還沒有添加到父View如果直接通過getLayoutParams()當然會出先null 指標異常(可以查看源碼) LinearLayout.LayoutParams ivParams = (LinearLayout.LayoutParams) ivIco.getLayoutParams(); //給用於顯示頭像的ImageView設定寬高 ivParams.width = DensityUtil.dip2px(this,100f); ivParams.height = DensityUtil.dip2px(this,100f); //設定置中的方式(子View在父View下的擺放方式為水平置中) ivParams.gravity = Gravity.CENTER_HORIZONTAL; ivParams.setMargins(0,DensityUtil.dip2px(this,100),0,0); ivIco.setLayoutParams(ivParams); //建立水平排列的線性布局,用於放置賬戶相關的View LinearLayout userCountLayout = new LinearLayout(this); userCountLayout.setOrientation(LinearLayout.HORIZONTAL); //將當前的建立的線性布局添加到根View rootLayout.addView(userCountLayout); //顯示使用者名稱的TextView TextView tvShowUser = new TextView(this); tvShowUser.setText("使用者名稱:"); userCountLayout.addView(tvShowUser); LinearLayout.LayoutParams userCountlayoutParams = (LinearLayout.LayoutParams) tvShowUser.getLayoutParams(); userCountlayoutParams.setMargins(DensityUtil.dip2px(this,20),DensityUtil.dip2px(this,20),DensityUtil.dip2px(this,20),DensityUtil.dip2px(this,20)); //建立用於填寫使用者賬戶的EditText EditText edtUserCount = new EditText(this); userCountLayout.addView(edtUserCount); edtUserCount.setHint("請輸入使用者名稱"); LinearLayout.LayoutParams edtUserCountlayoutParams = (LinearLayout.LayoutParams) edtUserCount.getLayoutParams(); edtUserCount.setWidth(0); edtUserCountlayoutParams.weight = 1; //父View的Gravity屬性,確定子View的擺放規則 edtUserCountlayoutParams.gravity = Gravity.CENTER_VERTICAL; //View.setGravity方法相當於 android:gravity="center",該屬性工作表示對View中內容進行的限定// edtUserCount.setGravity(Gravity.CENTER); //建立線性布局用於容納密碼相關的View LinearLayout pwdLayout = new LinearLayout(this); pwdLayout.setGravity(LinearLayout.HORIZONTAL); LinearLayout.LayoutParams pwdLayoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.WRAP_CONTENT); pwdLayout.setLayoutParams(pwdLayoutParams); rootLayout.addView(pwdLayout); //TextView顯示密碼文本 TextView tvShowPwd = new TextView(this); tvShowPwd.setText("密 碼:"); pwdLayout.addView(tvShowPwd); LinearLayout.LayoutParams tvShowPwdParams = (LinearLayout.LayoutParams) tvShowPwd.getLayoutParams(); tvShowPwdParams.setMargins(DensityUtil.dip2px(this,20),DensityUtil.dip2px(this,20),DensityUtil.dip2px(this,20),DensityUtil.dip2px(this,20)); tvShowPwdParams.gravity = Gravity.CENTER_VERTICAL; //EdtText用於輸入密碼 EditText edtPwd = new EditText(this); edtPwd.setHint("請輸入密碼"); pwdLayout.addView(edtPwd); //使用new的方式來擷取 LayoutParams LinearLayout.LayoutParams edtPwdParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); //設定權重 edtPwdParams.weight = 1; edtPwdParams.width = 0; //將布局參數設定給EdtText edtPwd.setLayoutParams(edtPwdParams); //用於進行登入的button Button btnLogin = new Button(this); btnLogin.setText("登陸"); rootLayout.addView(btnLogin); LinearLayout.LayoutParams btnLoginParams = (LinearLayout.LayoutParams) btnLogin.getLayoutParams(); //設定Button的大小 btnLoginParams.width = LinearLayout.LayoutParams.WRAP_CONTENT; btnLoginParams.height= LinearLayout.LayoutParams.WRAP_CONTENT; btnLoginParams.gravity = Gravity.CENTER_HORIZONTAL; }}