动态布局

来源:互联网 发布:软件项目关键技术指标 编辑:程序博客网 时间: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来接收内容

   
 //针对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
原创粉丝点击