使用JAVA代码实现Android布局(一)RelativeLayout
- <RelativeLayout??
- ???????android:id="@+id/drawer_info"??
- ???????android:layout_width="match_parent"??
- ???????android:layout_height="120dp"?>??
- ??
- ???????<!--?個(gè)人資料布局?-->??
- ??
- ???????<ImageView??
- ???????????android:id="@+id/user_head"??
- ???????????android:layout_width="60dp"??
- ???????????android:layout_height="60dp"??
- ???????????android:layout_marginBottom="10dp"??
- ???????????android:layout_marginLeft="20dp"??
- ???????????android:layout_marginTop="25dp"??
- ???????????android:src="@drawable/user_demo"?>??
- ???????</ImageView>??
- ??
- ???????<TextView??
- ???????????android:id="@+id/user_name"??
- ???????????android:layout_width="wrap_content"??
- ???????????android:layout_height="wrap_content"??
- ???????????android:layout_alignTop="@id/user_head"??
- ???????????android:layout_marginLeft="20dp"??
- ???????????android:layout_marginTop="10dp"??
- ???????????android:layout_toRightOf="@id/user_head"??
- ???????????android:text="Mr?Zdy"??
- ???????????android:textSize="18sp"?>??
- ???????</TextView>??
- ??
- ???????<TextView??
- ???????????android:id="@+id/user_email"??
- ???????????android:layout_width="wrap_content"??
- ???????????android:layout_height="wrap_content"??
- ???????????android:layout_below="@id/user_name"??
- ???????????android:layout_marginLeft="20dp"??
- ???????????android:layout_marginTop="3dp"???
- ???????????android:layout_toRightOf="@id/user_head"??
- ???????????android:text="zhudongya123@gmail.com"??
- ???????????android:textSize="14sp"?>??
- ???????</TextView>??
- ???</RelativeLayout>??
最終效果圖是這個(gè)樣子的。相應(yīng)的JAVA代碼如下。
我會(huì)在后面逐一解釋這些代碼。請忽略RelativeLayout背景和圓形的圖片,本例應(yīng)該是普通的ImageView.
public class MainActivity extends AppCompatActivity {@Override protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); RelativeLayout rootlayout = new RelativeLayout(this); rootlayout.setLayoutParams(new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, dip2px(120))); rootlayout.setId(0); ImageView imageView = new ImageView(this); RelativeLayout.LayoutParams image_Params = new RelativeLayout.LayoutParams(dip2px(60), dip2px(60)); image_Params.setMargins(dip2px(20), dip2px(25), 0, dip2px(10)); imageView.setLayoutParams(image_Params); imageView.setImageResource(R.mipmap.ic_launcher); imageView.setId(R.id.my_test1); TextView text_Name = new TextView(this); RelativeLayout.LayoutParams text_Name_Params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT); text_Name_Params.addRule(RelativeLayout.RIGHT_OF, imageView.getId()); text_Name_Params.addRule(RelativeLayout.ALIGN_TOP, imageView.getId()); text_Name_Params.setMargins(dip2px(20), dip2px(10), 0, 0); text_Name.setLayoutParams(text_Name_Params); text_Name.setText("Mr.Zdy"); text_Name.setTextSize(TypedValue.COMPLEX_UNIT_SP, 18); text_Name.setId(R.id.my_test2); TextView text_Email = new TextView(this); RelativeLayout.LayoutParams text_Email_Params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT); text_Email_Params.addRule(RelativeLayout.RIGHT_OF, imageView.getId()); text_Email_Params.addRule(RelativeLayout.BELOW, text_Name.getId()); text_Email_Params.setMargins(dip2px(20), dip2px(3), 0, 0); text_Email.setLayoutParams(text_Email_Params); text_Email.setText("zhudongya123@gmail.com"); text_Email.setTextSize(TypedValue.COMPLEX_UNIT_SP, 14); rootlayout.addView(imageView, image_Params); rootlayout.addView(text_Name, text_Name_Params); rootlayout.addView(text_Email, text_Email_Params); setContentView(rootlayout); }public int dip2px(float dpValue) {final float scale = this.getResources().getDisplayMetrics().density; return (int) (dpValue * scale + 0.5f); }}在studio中直接設(shè)置id 會(huì)報(bào)錯(cuò),所以改用下面方法處理
這個(gè)是這個(gè)界面的根布局。?
然后我們使用了setLayoutParams方法定義了該布局的長度和寬度。?
在XML代碼中,我們是直接寫出View的width,height,margin。?
而在Java代碼中,我們必須使用LayoutParams類來指定其屬性。 [java] view plaincopy
- rootlayout.setLayoutParams(new?RelativeLayout.LayoutParams(??
- ????????????????LayoutParams.MATCH_PARENT,?dip2px(120)));??
同時(shí)LinearLayout.LayoutParams也是繼承自ViewGroup.LayoutParams。
這些LayoutParams類用來在Java代碼中指定View的各種屬性。例如width,height,margin等等。?
通常沒有特殊屬性時(shí),我們可以直接使用LayoutParams。?
例如:rootlayout.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT));?
然后我們設(shè)置了rootlayout的ID.rootlayout.setId(0);?
接下來我們定義了一個(gè)ImageView。 [java] view plaincopy
- ImageView?imageView?=?new?ImageView(this);??
- RelativeLayout.LayoutParams?image_Params?=?new?RelativeLayout.LayoutParams(??
- ????????dip2px(60),?dip2px(60));??
- image_Params.setMargins(dip2px(20),?dip2px(25),?0,?dip2px(10));??
- imageView.setLayoutParams(image_Params);??
- imageView.setImageResource(R.drawable.user_demo);??
- imageView.setId(1);??
在指定ImageView的寬度和高度時(shí),我使用了一個(gè)方法dip2px,這個(gè)方法是將dp值轉(zhuǎn)化為px值,因?yàn)樵赬ML中,我直接使用了120dp,60dp這樣的單位,但是在JAVA代碼中,默認(rèn)單位是px(像素),所以我們必須定義了這樣一個(gè)方法來轉(zhuǎn)換單位。 [java] view plaincopy
- public?int?dip2px(float?dpValue)?{??
- final?float?scale?=?this.getResources().getDisplayMetrics().density;??
- return?(int)?(dpValue?*?scale?+?0.5f);??
- }??
使用setLayoutParams方法將定義好的屬性施加到ImageView上。?
接下來是一個(gè)TextView。
[java] view plaincopy
- TextView?text_Name?=?new?TextView(this);??
- RelativeLayout.LayoutParams?text_Name_Params?=?new?RelativeLayout.LayoutParams(??
- ????????RelativeLayout.LayoutParams.WRAP_CONTENT,??
- ????????RelativeLayout.LayoutParams.WRAP_CONTENT);??
- text_Name_Params.addRule(RelativeLayout.RIGHT_OF,?imageView.getId());??
- text_Name_Params.addRule(RelativeLayout.ALIGN_TOP,?imageView.getId());??
- text_Name_Params.setMargins(dip2px(20),?dip2px(10),?0,?0);??
在定義RelativeLayout.LayoutParams變量text_Name_Params時(shí),我使用了addRule這個(gè)方法。?
addRule這里執(zhí)行了兩次都是兩個(gè)參數(shù),第一個(gè)代表屬性,第二個(gè)表示該與該屬性關(guān)聯(lián)的View的Id。?
這里我們要注意,我們也可以這樣寫?
text_Name_Params.addRule(RelativeLayout.RIGHT_OF, 1);
因?yàn)槲覀儗mageView的Id指定為1,但是當(dāng)你使用imageView.getId()這樣的寫法時(shí),你也必須在前面使用setId方法來指定其Id。?
在某些情況下,addRule可能只有一個(gè)參數(shù)。
例如:addRule(RelativeLayout.CENTER_VERTICAL),有些時(shí)候第二個(gè)參數(shù)可能代表布爾值,例如addRule(RelativeLayout.ALIGN_PARENT_TOP, RelativeLayout.TRUE);
- text_Name.setLayoutParams(text_Name_Params);??
- text_Name.setText("Mr.Zdy");??
- text_Name.setTextSize(TypedValue.COMPLEX_UNIT_SP,?18);??
- text_Name.setId(2);??
使用setTextSize方法時(shí),我們的第一個(gè)參數(shù)將單位強(qiáng)制指定為Sp,默認(rèn)是Px。
最后我們使用addview方法將三個(gè)View加入rootLayout中。并使用setContentView加載視圖。
- rootlayout.addView(imageView,?image_Params);??
- ?????rootlayout.addView(text_Name,?text_Name_Params);??
- ?????rootlayout.addView(text_Email,?text_Email_Params);??
- ?????setContentView(rootlayout);??
addView也可以只有一個(gè)參數(shù),將第二個(gè)Params參數(shù)省略,因?yàn)榍懊嫠械腣iew我都已經(jīng)使用setLayoutParams指定其屬性,所以在這里addView方法也可不寫第二個(gè)參數(shù)。
個(gè)人觀點(diǎn),僅供參考。
參考資料:
[addRule方法的使用](http://zhidao.baidu.com/link?url=R6E6Hwoea_SQFi5U_OwqZq0lqihpRkWYpOw9nZReYRc-1M4eUMzvyHjPn5FL0323gfSPssBLZLTgeKPeMrQ7W875uBxsUJbOaavpPmFCwMW)
[Android 步步為營 第5營 代碼控制UI,View](http://www.cnblogs.com/vivid-stanley/archive/2012/08/22/2651399.html)
[android-getTextSize返回值是以像素(px)為單位的,setTextSize()以sp為單位](http://blog.csdn.net/lizhenmingdirk/article/details/7349386)
[Android中LayoutParams的用法](http://www.cnblogs.com/zhengbeibei/archive/2013/03/29/2989263.html)
總結(jié)
以上是生活随笔為你收集整理的使用JAVA代码实现Android布局(一)RelativeLayout的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 推车多少钱啊?
- 下一篇: android 支付宝支付 出现系统繁忙