Android- 布局(Layout)和菜单(Menu)
在 Android 中各种布局的应用,以及菜单效果的实现
各种布局方式的应用,FrameLayout, LinearLayout, TableLayout, AbsoluteLayout, RelativeLayout
为指定元素配置上下文菜单,为应用程序配置选项菜单,以及多级菜单的实现
1、各种布局方式的演示
res/layout/main.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 | <?xml version= "1.0" encoding= "utf-8" ?> <!-- layout_width - 宽。fill_parent: 宽度跟着父元素走;wrap_content: 宽度跟着本身的内容走;直接指定一个 px 值来设置宽 layout_height - 高。fill_parent: 高度跟着父元素走;wrap_content: 高度跟着本身的内容走;直接指定一个 px 值来设置高 --> <!-- LinearLayout - 线形布局。 orientation - 容器内元素的排列方式。vertical: 子元素们垂直排列;horizontal: 子元素们水平排列 gravity - 内容的排列形式。常用的有 top, bottom, left, right, center 等,详见文档 --> <LinearLayout xmlns:android= "http://schemas.android.com/apk/res/android" android:orientation= "vertical" android:gravity= "right" android:layout_width= "fill_parent" android:layout_height= "fill_parent" > <!-- FrameLayout - 层叠式布局。以左上角为起点,将 FrameLayout 内的元素一层覆盖一层地显示 --> <FrameLayout android:layout_height= "wrap_content" android:layout_width= "fill_parent" > <TextView android:layout_width= "wrap_content" android:layout_height= "wrap_content" android:text= "FrameLayout" > </TextView> <TextView android:layout_width= "wrap_content" android:layout_height= "wrap_content" android:text= "Frame Layout" > </TextView> </FrameLayout> <TextView android:layout_width= "wrap_content" android:layout_height= "wrap_content" android:text= "@string/hello" /> <!-- TableLayout - 表格式布局。 TableRow - 表格内的行,行内每一个元素算作一列 collapseColumns - 设置 TableLayout 内的 TableRow 中需要隐藏的列的列索引,多个用“,”隔开 stretchColumns - 设置 TableLayout 内的 TableRow 中需要拉伸(该列会拉伸到所有可用空间)的列的列索引,多个用“,”隔开 shrinkColumns - 设置 TableLayout 内的 TableRow 中需要收缩(为了使其他列不会被挤到屏幕外,此列会自动收缩)的列的列索引,多个用“,”隔开 --> <TableLayout android:id= "@+id/TableLayout01" android:layout_width= "fill_parent" android:layout_height= "wrap_content" android:collapseColumns= "1" > <TableRow android:id= "@+id/TableRow01" android:layout_width= "fill_parent" android:layout_height= "wrap_content" > <TextView android:layout_width= "wrap_content" android:layout_weight= "1" android:layout_height= "wrap_content" android:text= "行1列1" /> <TextView android:layout_width= "wrap_content" android:layout_weight= "1" android:layout_height= "wrap_content" android:text= "行1列2" /> <TextView android:layout_width= "wrap_content" android:layout_weight= "1" android:layout_height= "wrap_content" android:text= "行1列3" /> </TableRow> <TableRow android:id= "@+id/TableRow01" android:layout_width= "wrap_content" android:layout_height= "wrap_content" > <TextView android:layout_width= "wrap_content" android:layout_height= "wrap_content" android:text= "行2列1" /> </TableRow> </TableLayout> <!-- AbsoluteLayout - 绝对定位布局。 layout_x - x 坐标。以左上角为顶点 layout_y - y 坐标。以左上角为顶点 --> <AbsoluteLayout android:layout_height= "wrap_content" android:layout_width= "fill_parent" > <TextView android:layout_width= "wrap_content" android:layout_height= "wrap_content" android:text= "AbsoluteLayout" android:layout_x= "100px" android:layout_y= "100px" /> </AbsoluteLayout> <!-- RelativeLayout - 相对定位布局。 layout_centerInParent - 将当前元素放置到其容器内的水平方向和垂直方向的中央位置(类似的属性有 :layout_centerHorizontal, layout_alignParentLeft 等) layout_marginLeft - 设置当前元素相对于其容器的左侧边缘的距离 layout_below - 放置当前元素到指定的元素的下面 layout_alignRight - 当前元素与指定的元素右对齐 --> <RelativeLayout android:id= "@+id/RelativeLayout01" android:layout_width= "fill_parent" android:layout_height= "fill_parent" > <TextView android:layout_width= "wrap_content" android:id= "@+id/abc" android:layout_height= "wrap_content" android:text= "centerInParent=true" android:layout_centerInParent= "true" /> <TextView android:layout_width= "wrap_content" android:layout_height= "wrap_content" android:text= "marginLeft=20px" android:layout_marginLeft= "20px" /> <TextView android:layout_width= "wrap_content" android:layout_height= "wrap_content" android:text= "xxx" android:layout_below= "@id/abc" android:layout_alignRight= "@id/abc" /> </RelativeLayout> </LinearLayout> res/values/strings.xml <?xml version= "1.0" encoding= "utf-8" ?> <resources> <string name= "hello" >Hello Layout</string> <string name= "app_name" >webabcd_layout</string> </resources> Main.java 代码 package com.webabcd.layout; import android.app.Activity; import android.os.Bundle; public class Main extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.main); } } 2、上下文菜单,选项菜单,子菜单 res/layout/main.xml 代码 <?xml version= "1.0" encoding= "utf-8" ?> <LinearLayout xmlns:android= "http://schemas.android.com/apk/res/android" android:orientation= "vertical" android:layout_width= "fill_parent" android:layout_height= "fill_parent" > <TextView android:id= "@+id/txt1" android:layout_width= "fill_parent" android:layout_height= "wrap_content" android:text= "@string/hello_contextMenu" /> <TextView android:id= "@+id/txt2" android:layout_width= "fill_parent" android:layout_height= "wrap_content" android:text= "@string/hello_subMenu" /> </LinearLayout> res/values/strings.xml 代码 <?xml version= "1.0" encoding= "utf-8" ?> <resources> <string name= "hello_contextMenu" >Hello Context Menu</string> <string name= "hello_subMenu" >Hello Context Sub Menu</string> <string name= "app_name" >webabcd_menu</string> </resources> Main.java 代码 package com.webabcd.menu; import android.app.Activity; import android.os.Bundle; import android.view.ContextMenu; import android.view.Menu; import android.view.MenuItem; import android.view.SubMenu; import android.view.View; import android.view.ContextMenu.ContextMenuInfo; import android.widget.TextView; import android.widget.Toast; // 演示两种菜单的实现方式:上下文菜单(通过在某元素上长按,来呼出菜单)和选项菜单(通过按手机上的菜单按钮,来呼出菜单) public class Main extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.main); // 为 R.id.txt1 注册一个上下文菜单(在此 TextView 上长按,则会呼出上下文菜单) // 具体呼出的菜单内容需要重写 onCreateContextMenu 来创建 TextView txt1 = (TextView) this .findViewById(R.id.txt1); this .registerForContextMenu(txt1); // 为 R.id.txt2 注册一个上下文菜单 TextView txt2 = (TextView) this .findViewById(R.id.txt2); this .registerForContextMenu(txt2); } // 重写 onCreateContextMenu 用以创建上下文菜单 // 重写 onContextItemSelected 用以响应上下文菜单 @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { super .onCreateContextMenu(menu, v, menuInfo); // 创建 R.id.txt1 的上下文菜单 if (v == (TextView) this .findViewById(R.id.txt1)) { // ContextMenu.setIcon() - 设置菜单的图标 // ContextMenu.setHeaderTitle() - 设置菜单的标题 menu.setHeaderIcon(R.drawable.icon01); menu.setHeaderTitle( "我是菜单" ); // 用 ContextMenu.add() 来增加菜单项,返回值为 MenuItem // 第一个参数:组ID // 第二个参数:菜单项ID // 第三个参数:顺序号 // 第四个参数:菜单项上显示的内容 menu.add(1, 0, 0, "菜单1" ); // MenuItem - 新增菜单项后的返回类型,针对菜单项的其他设置在此对象上操作 menu.add(1, 1, 1, "菜单2" ).setCheckable( true ); } // 创建 R.id.txt2 的上下文菜单(多级上下文菜单) else if (v == (TextView) this .findViewById(R.id.txt2)) { // ContextMenu.addSubMenu("菜单名称") - 用来添加子菜单。子菜单其实就是一个特殊的菜单 SubMenu sub = menu.addSubMenu( "父菜单1" ); sub.setIcon(R.drawable.icon01); sub.add(0, 0, 0, "菜单1" ); sub.add(0, 1, 1, "菜单2" ); sub.setGroupCheckable(1, true , true ); SubMenu sub2 = menu.addSubMenu( "父菜单2" ); sub2.setIcon(R.drawable.icon01); sub2.add(1, 0, 0, "菜单3" ); sub2.add(1, 1, 1, "菜单4" ); sub2.setGroupCheckable(1, true , false ); } } // 重写 onCreateOptionsMenu 用以创建选项菜单 @Override public boolean onCreateOptionsMenu(Menu menu) { MenuItem menuItem = menu.add(0, 0, 0, "菜单111111111111111111111" ); // MenuItem.setIcon() - 设置菜单项的图标 // MenuItem.setTitleCondensed() - 菜单的简标题,如果指定了简标题的话,菜单项上的标题将会以此简标题为准 // MenuItem.setAlphabeticShortcut() - 设置选中此菜单项的快捷键 // 注:菜单项超过 6 个的话,第 6 个菜单将会变为 More 菜单,多余的菜单会在单击 More 菜单之后显示出来 menuItem.setIcon(R.drawable.icon01); menuItem.setTitleCondensed( "菜单1" ); menuItem.setAlphabeticShortcut( 'a' ); menu.add(0, 1, 1, "菜单2" ).setIcon(R.drawable.icon02); menu.add(0, 2, 2, "菜单3" ).setIcon(R.drawable.icon03); menu.add(0, 3, 3, "菜单4" ); menu.add(0, 4, 4, "菜单5" ); menu.add(0, 5, 5, "菜单6" ); menu.add(0, 6, 6, "菜单7" ).setIcon(R.drawable.icon04); menu.add(0, 7, 7, "菜单8" ).setIcon(R.drawable.icon05); return true ; } // 重写 onOptionsItemSelected 用以响应选项菜单 @Override public boolean onOptionsItemSelected(MenuItem item) { super .onOptionsItemSelected(item); Toast.makeText(Main. this , "被单击的菜单项为:" + String.valueOf(item.getItemId()), Toast.LENGTH_SHORT).show(); return false ; } } |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步