动态布局
来源:互联网 发布:软件项目关键技术指标 编辑:程序博客网 时间:2024/04/30 12:07
1#### PopuWindow
初始化
// 先加载窗口的布局
View layout = getLayoutInflater().inflate(R.layout.popu_layout,
null);
layout.findViewById(R.id.menu_01).setOnClickListener(this);
layout.findViewById(R.id.menu_02).setOnClickListener(this);
// 创建了弹出框
window = new PopupWindow(layout, 200,
ViewGroup.LayoutParams.WRAP_CONTENT);
// 配置弹出框的其他信息
// 设置背景(能够响应返回键)
window.setBackgroundDrawable(new ColorDrawable());
// 设置获取焦点
window.setFocusable(true);
window.setOutsideTouchable(true);
显示窗口
window.showAsDropDown(btnShow, -100, 0);参考某个视图显示
第二个第三个参数分别表示水平和垂直方向的偏移量
//显示在一个容器中(相对的容器,位置,x方向的偏移,y方向的偏移)
window.showAtLocation(parent, gravity, x, y)
隐藏窗口
window.dismiss();
#### PopuMenu
//创建PopuMenu(第二个参数表示触发该弹出菜单的视图)
PopupMenu pMenu = new PopupMenu(this, btnPopuMenu);
//向popumenu中添加菜单
pMenu.getMenuInflater().inflate(R.menu.main, pMenu.getMenu());
//设置菜单项的点击监听
pMenu.setOnMenuItemClickListener(new OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
//根据菜单项的id来区分菜单
switch (item.getItemId()) {
case R.id.action_settings:
Toast.makeText(PopuWindowActivity.this, item.getTitle(), 2000).show();
break;
}
return true;
}
});
pMenu.show(); //显示菜单
#### 动态布局
1、加载到/创建了布局对象(ViewGroup及其子类对象)
// 创建一个布局
layout = new LinearLayout(this);
layout.setOrientation(LinearLayout.VERTICAL);
2、创建子视图(布局的孩子)
// 创建按钮
Button btn1 = new Button(this);
//设置基本属性
3、通过布局的LayoutParams参数配置子视图的布局效果(宽高边距)
// 配置布局参数
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(200,
LinearLayout.LayoutParams.WRAP_CONTENT);
lp.leftMargin = 20;
4、对子视图使用布局参数
btn1.setLayoutParams(lp);
5、添加子视图到布局中
layout.addView(btn1);
移除子视图
//获取孩子的总个数
int count = layout.getChildCount();
//获取孩子的对象
View child = layout.getChildAt(count-1);
//移除子视图
layout.removeView(child);
移除全部孩子
layout.removeAllView();
#### Activity生命周期
运行前
onCreate 创建完毕
onStart 启动 <----------------onRestart--------|
onResume 状态恢复 <-------------------- |
| |
运行(用户可以看到布局,可以操作界面元素) | |
运行后 | |
| |
onPause 暂停(失去焦点)---------------- |
onStop 停止(整个界面都黑了不可见不可操作)--------
onDestroy 销毁(释放资源)
Activity常用方法
setContentView 设置布局
startActivity 启动新界面
finish 结束当前界面
findViewById从布局中找到控件
getIntent()获取启动该Acitivity的Intent对象
#### Intent
启动新界面,可以通过putExtras方法来携带数据
Intent it = new Intent(this, Activity02.class);
//携带数据(Bundle)
it.putExtra("m_name", "张三");
it.putExtra("age", 20);
startActivity(it);
目标界面,接收数据
Intent intent = getIntent();
String name = intent.getStringExtra("m_name");
int a = intent.getIntExtra("age", 0);
##### startActivityForResult
1、在启动触发界面使用startActivityForResult启动
Intent it2 = new Intent(this,Activity02.class);
it2.putExtra("m_name", "第二种跳转");
//为了一个结果启动界面(第二个参数是一个requestCode,行为id)
startActivityForResult(it2, 100);
2、被启动界面可以getIntent得到被启动的Intent对象,处理内容,但是在结束之前需要通过setResult返回内容
//返回数据给上一个界面(针对startActivityForResult)
setResult(RESULT_OK);
finish();
携带数据回去:
Intent it = new Intent();
it.putExtra("result", "Activity02返回的内容");
setResult(RESULT_OK, it);
finish();
3、在启动的触发界面重写onActivityResult来接收内容
#### Activity的启动方式
查看栈结构的指令
adb shell dumpsys activity > D:/log201704271746.txt
搜索Running activities
通过在<activity标签上使用android:launchMode=""设置启动方式
1、standard,默认值,没启动一次Activity就被创建一个实例,创建的实例加到同一个栈中,放在栈顶
2、singleTop,如果当前的Activity已经在栈顶,则不会创建新实例,而是直接触发其onNewIntent方法
3、singleTask,启动的新Activity会放到一个新的栈中,该值要结合android:taskAffinity="com.abc"来使用,并且taskAffinity的值必须跟应用包名不一样
初始化
// 先加载窗口的布局
View layout = getLayoutInflater().inflate(R.layout.popu_layout,
null);
layout.findViewById(R.id.menu_01).setOnClickListener(this);
layout.findViewById(R.id.menu_02).setOnClickListener(this);
// 创建了弹出框
window = new PopupWindow(layout, 200,
ViewGroup.LayoutParams.WRAP_CONTENT);
// 配置弹出框的其他信息
// 设置背景(能够响应返回键)
window.setBackgroundDrawable(new ColorDrawable());
// 设置获取焦点
window.setFocusable(true);
window.setOutsideTouchable(true);
显示窗口
window.showAsDropDown(btnShow, -100, 0);参考某个视图显示
第二个第三个参数分别表示水平和垂直方向的偏移量
//显示在一个容器中(相对的容器,位置,x方向的偏移,y方向的偏移)
window.showAtLocation(parent, gravity, x, y)
隐藏窗口
window.dismiss();
#### PopuMenu
//创建PopuMenu(第二个参数表示触发该弹出菜单的视图)
PopupMenu pMenu = new PopupMenu(this, btnPopuMenu);
//向popumenu中添加菜单
pMenu.getMenuInflater().inflate(R.menu.main, pMenu.getMenu());
//设置菜单项的点击监听
pMenu.setOnMenuItemClickListener(new OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
//根据菜单项的id来区分菜单
switch (item.getItemId()) {
case R.id.action_settings:
Toast.makeText(PopuWindowActivity.this, item.getTitle(), 2000).show();
break;
}
return true;
}
});
pMenu.show(); //显示菜单
#### 动态布局
1、加载到/创建了布局对象(ViewGroup及其子类对象)
// 创建一个布局
layout = new LinearLayout(this);
layout.setOrientation(LinearLayout.VERTICAL);
2、创建子视图(布局的孩子)
// 创建按钮
Button btn1 = new Button(this);
//设置基本属性
3、通过布局的LayoutParams参数配置子视图的布局效果(宽高边距)
// 配置布局参数
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(200,
LinearLayout.LayoutParams.WRAP_CONTENT);
lp.leftMargin = 20;
4、对子视图使用布局参数
btn1.setLayoutParams(lp);
5、添加子视图到布局中
layout.addView(btn1);
移除子视图
//获取孩子的总个数
int count = layout.getChildCount();
//获取孩子的对象
View child = layout.getChildAt(count-1);
//移除子视图
layout.removeView(child);
移除全部孩子
layout.removeAllView();
#### Activity生命周期
运行前
onCreate 创建完毕
onStart 启动 <----------------onRestart--------|
onResume 状态恢复 <-------------------- |
| |
运行(用户可以看到布局,可以操作界面元素) | |
运行后 | |
| |
onPause 暂停(失去焦点)---------------- |
onStop 停止(整个界面都黑了不可见不可操作)--------
onDestroy 销毁(释放资源)
Activity常用方法
setContentView 设置布局
startActivity 启动新界面
finish 结束当前界面
findViewById从布局中找到控件
getIntent()获取启动该Acitivity的Intent对象
#### Intent
启动新界面,可以通过putExtras方法来携带数据
Intent it = new Intent(this, Activity02.class);
//携带数据(Bundle)
it.putExtra("m_name", "张三");
it.putExtra("age", 20);
startActivity(it);
目标界面,接收数据
Intent intent = getIntent();
String name = intent.getStringExtra("m_name");
int a = intent.getIntExtra("age", 0);
##### startActivityForResult
1、在启动触发界面使用startActivityForResult启动
Intent it2 = new Intent(this,Activity02.class);
it2.putExtra("m_name", "第二种跳转");
//为了一个结果启动界面(第二个参数是一个requestCode,行为id)
startActivityForResult(it2, 100);
2、被启动界面可以getIntent得到被启动的Intent对象,处理内容,但是在结束之前需要通过setResult返回内容
//返回数据给上一个界面(针对startActivityForResult)
setResult(RESULT_OK);
finish();
携带数据回去:
Intent it = new Intent();
it.putExtra("result", "Activity02返回的内容");
setResult(RESULT_OK, it);
finish();
3、在启动的触发界面重写onActivityResult来接收内容
//针对startActivityForResult启动之后接收结果的方法 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if(requestCode == 100){ if(resultCode == RESULT_OK){ String result = "abc"; if (null != data) { result = data.getStringExtra("result"); } Toast.makeText(this, result, 2000).show(); }else{ Toast.makeText(this, "收到:"+resultCode, 2000).show(); } } }
#### Activity的启动方式
查看栈结构的指令
adb shell dumpsys activity > D:/log201704271746.txt
搜索Running activities
通过在<activity标签上使用android:launchMode=""设置启动方式
1、standard,默认值,没启动一次Activity就被创建一个实例,创建的实例加到同一个栈中,放在栈顶
2、singleTop,如果当前的Activity已经在栈顶,则不会创建新实例,而是直接触发其onNewIntent方法
3、singleTask,启动的新Activity会放到一个新的栈中,该值要结合android:taskAffinity="com.abc"来使用,并且taskAffinity的值必须跟应用包名不一样
4、singleInstance,跟singleTask类似,新启动的Activity(如A)会放到新的栈中,区别就是新的栈中永远只有一个实例,如果新栈中的Activity(如A)启动了新的Activity(如B),这时B会放到原来的栈中
在java中动态布局
public class LayoutInJavaActivity extends Activity implements OnClickListener {LinearLayout layout;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.layout_in_java_activity);layout = (LinearLayout) findViewById(R.id.m_layout);// // 创建一个布局// layout = new LinearLayout(this);// layout.setOrientation(LinearLayout.VERTICAL);for (int i = 0; i < 3; i++) {// 创建按钮Button btn1 = new Button(this);btn1.setId(1000 + i);btn1.setText("按钮" + i);btn1.setTextSize(20);btn1.setTextColor(0xffff0000);// 配置布局参数LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,LinearLayout.LayoutParams.WRAP_CONTENT);lp.leftMargin = 20;btn1.setLayoutParams(lp);btn1.setOnClickListener(this);// 向根节点中添加子视图layout.addView(btn1, 0);}// setContentView(layout);}@Overridepublic void onClick(View v) {switch (v.getId()) {case 1000:Toast.makeText(this, "按钮被点击", 2000).show();// 获取孩子的总个数int count = layout.getChildCount();// 获取孩子的对象View child = layout.getChildAt(count - 1);// 移除子视图layout.removeView(child);break;case 1001://获取布局参数LinearLayout.LayoutParams lp = (LayoutParams) v.getLayoutParams();//获取原来的左外边距int old = lp.leftMargin;//改变外边距lp.leftMargin = old+10;//修改布局参数v.setLayoutParams(lp);break;default:break;}}}
public class Activity01 extends Activity implements OnClickListener {@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);setTitle("Acitivity01界面");setContentView(R.layout.activity_01_layout);Log.e("m_tag", "Activity01===onCreate");findViewById(R.id.btn_just_start).setOnClickListener(this);findViewById(R.id.btn_start_for_result).setOnClickListener(this);findViewById(R.id.btn_start_self).setOnClickListener(this);}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.btn_just_start:Intent it = new Intent(this, Activity02.class);// 携带数据(Bundle)it.putExtra("m_name", "张三");it.putExtra("age", 20);startActivity(it);break;case R.id.btn_start_for_result:Intent it2 = new Intent(this, Activity02.class);it2.putExtra("m_name", "第二种跳转");// 为了一个结果启动界面startActivityForResult(it2, 100);break;case R.id.btn_start_self:Intent it3 = new Intent(this,Activity01.class);startActivity(it3);break;default:break;}}// 针对startActivityForResult启动之后接收结果的方法@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);if (requestCode == 100) {if (resultCode == RESULT_OK) {String result = "abc";if (null != data) {result = data.getStringExtra("result");}Toast.makeText(this, result, 2000).show();} else {Toast.makeText(this, "收到:" + resultCode, 2000).show();}
}}public class Activity02 extends Activity implements OnClickListener{private TextView mTv;@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);setContentView(R.layout.activity_02_layout);mTv = (TextView) findViewById(R.id.tv_result);setTitle("这个是一个Acitivity02界面");Log.e("m_tag", "Activity02==>===onCreate");//获取启动该界面的IntentIntent intent = getIntent();String name = intent.getStringExtra("m_name"); //nullint a = intent.getIntExtra("age", 0);mTv.setText(name+" | "+a);findViewById(R.id.btn_finish).setOnClickListener(this);}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.btn_finish://返回数据给上一个界面(针对startActivityForResult)//setResult(RESULT_OK);Intent it = new Intent();it.putExtra("result", "Activity02返回的内容");setResult(RESULT_OK, it);finish();break;}}
0 0
- 动态布局
- 动态布局
- 动态布局
- 动态布局
- Android 动态布局 (代码布局)
- 界面布局动态调整
- Android 动态加载布局
- GRIDPANEL动态布局
- 界面布局动态调整
- Android 动态更改布局
- Android 动态加载布局
- 动态广告布局
- android 动态布局
- Android 动态加载布局
- 动态显示+XML布局
- android动态界面布局
- Android 动态加载布局
- Android 动态加载布局
- OSPF协议之详细图解
- android 微信红包 hook 版控制金额尾数原理
- 排序:排序面试指南
- Unity制作《水果忍者》刀光特效
- DIY心形流水灯
- 动态布局
- 3分钟弄明白JAVA三大修饰符
- sublime text 3 + python配置,完整搭建及常用插件安装
- 三.Mybatis高级查询
- 二叉排序树的建立与查找
- Android动画(二),属性动画
- 排序1:冒泡排序
- 在PHP5.3以上版本运行ecshop和ecmall出现的问题及解决方案
- LeetCode题目:376. Wiggle Subsequence