Android 3

来源:互联网 发布:sqlserver 视图概念 编辑:程序博客网 时间:2024/05/17 12:55

dp,sp,px

说明 px dp sp

Inflater

获取Inflater的三种方式
方式 getLayoutInflater getSystemService(LAYOUT_INFLATER_SERVICE) LayoutInflater.from(context)

提取布局属性

1.Theme 是窗体级别的,改变窗体样式
2.改变指定控件或layout的样式

style是可以继承的
属性的优先原则是,控件属性>style>style的父类

自定义控件(2)

View是如何工作的

方法 说明 1 构造器 2 onMesure() 3 onLayout() 4 onDraw() 5 invalidate()

下边介绍一下具体的代码

首先,创建一个自定义控件类

    public class RoundButton extends View {        private Paint buttonPaint = null;        private Rect rect = null;        private Integer count = 0;        private Integer backgroundColor;        public RoundButton(Context context) {            this(context, null);        }        public RoundButton(Context context, AttributeSet attrs) {            this(context, attrs, 0);        }        public RoundButton(Context context, AttributeSet attrs, int defStyleAttr) {            super(context, attrs, defStyleAttr);            init(context, attrs);        }        //初始化,实例化必要的对象,获取自定义属性        private void init(Context context, AttributeSet attrs) {            buttonPaint = new Paint();            rect = new Rect();            // 获取自定义属性集合            TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.RoundButton);            // 获取一个自定义控件的属性,第一个参数是,属性名称,第二个参数是默认值,即未指定此属性值的情况下,将使用默认值            backgroundColor = typedArray.getColor(R.styleable.RoundButton_backgroundColor, Color.RED);            // 给此自定义控件添加单击事件            setOnClickListener(new OnClickListener() {                @Override                public void onClick(View view) {                    //每次点击 +1                    ++count;                    // 刷新                    invalidate();                }            });        }        //绘制        @Override        protected void onDraw(Canvas canvas) {            super.onDraw(canvas);            // 设置颜色            buttonPaint.setColor(backgroundColor);            // 在画布上绘制一个圆形            canvas.drawCircle(240, 240, 200, buttonPaint);            buttonPaint.setColor(Color.WHITE);            buttonPaint.setTextSize(100);            // 通过getTextBounds获取一个字符串将要占用的大小            buttonPaint.getTextBounds(count.toString(), 0, count.toString().length(), rect);            //通过上边取得的区域大小(rect实例),通过计算使文字显示在中心            canvas.drawText(count.toString(), 240 - rect.width() / 2, 240 + rect.height() / 2, buttonPaint);        }    }

不要忘记,还需要在layout中定义出来哦,如下:

    <?xml version="1.0" encoding="utf-8"?>    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"        xmlns:tools="http://schemas.android.com/tools"        android:layout_width="match_parent"        android:layout_height="match_parent"        xmlns:app="http://schemas.android.com/apk/res-auto"        tools:context="com.lisen.part3.ShowActivity">        <com.lisen.part3.RoundButton //使用的自定义控件            android:layout_width="wrap_content"            android:layout_height="wrap_content"            app:backgroundColor="#4444ff"/>    </RelativeLayout>

自定义属性

在创建自己的控件后,就可以给它创建属于自己的属性了.
这里我们继续使用上边的自定义控件,这里一眼就可以看出有一个自定义属性app:backgroundColor=”#4444ff”
之所以有app:是因为这句话xmlns:app=”http://schemas.android.com/apk/res-auto” 一个xml命名空间

自定义属性需要创建在attrs.xml中,如果没有的话,可以在res/values目录下创建
内容如下:

    <?xml version="1.0" encoding="utf-8"?>    <resources>        <declare-styleable name="RoundButton">            <attr name="backgroundColor" format="color" />        </declare-styleable>    </resources>

Fragment 碎片

在一个活动上,我们可以显示或隐藏一个更小的活动,而这种活动称为碎片.它可以让我们更充分的利用屏幕并且达到更好的用户体验

如何创建一个碎片

    public class BlankFragment extends Fragment { //这里新建一个类,继承Fragment,这里的Fragment是android.app.Fragment        @Override        public void onCreate(Bundle savedInstanceState) {            super.onCreate(savedInstanceState);        }        @Override        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {            // 读取一个视图文件并解析            return inflater.inflate(R.layout.fragment_blank, container, true);        }    }

以下是在一个Activity中所写的代码

    // Activity 的 onCreate事件    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_show_fragment);        // 获取一个碎片管理器        FragmentManager fragmentManager = getFragmentManager();        // 开始碎片事务        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();        BlankFragment blank = new BlankFragment();        // 通过add方法添加碎片,并提交事务.        // 这里的R.id.layoutTest 是在当前的Activity的layout文件中创建的布局        fragmentTransaction.add(R.id.layoutTest, blank).commit();    }

BroadcastReceiver 广播

广播存在系统广播与自定义广播,系统广播主要有Android自己发送,例如:电量不足

广播的注册方式:
1.静默注册
静默注册,即在AndroidManifest.xml 中注册.例如:

```xml<receiver    android:name=".broadcastreceiver.MyReceiver"    android:enabled="true"    android:exported="true">    <intent-filter> //一个过滤器        <action android:name="com.xxx.broadcastreceiver" /> //只接收来此自定义的广播    </intent-filter></receiver>```

2.动态注册

    public class BroadcastActivity extends AppCompatActivity implements View.OnClickListener {        public static final String ACTION = "com.lisen.part3.broadcast";        private MyReceiver myReceiver = new MyReceiver();        @Override        protected void onCreate(Bundle savedInstanceState) {            super.onCreate(savedInstanceState);            setContentView(R.layout.activity_broadcast);            //创建一个过滤器            IntentFilter intentFilter = new IntentFilter();            // 设置要接收的标识            intentFilter.addAction(ACTION);            // 注册广播            registerReceiver(myReceiver, intentFilter);            Button btnSend = (Button) findViewById(R.id.btnSend);            btnSend.setOnClickListener(this);        }        @Override        public void onClick(View v) {            switch (v.getId()) {                case R.id.btnSend:                    Intent intent = new Intent();                    intent.setAction(ACTION); //这里的Action即我们上边定义的标识,如果不同那么就永远不会受到广播                    intent.putExtra("msgInfo", "我是广播,我来了!");                    sendBroadcast(intent); //发送广播                    break;            }        }    }

如何接收广播

    public class MyReceiver extends BroadcastReceiver {        public MyReceiver() {        }        @Override        public void onReceive(Context context, Intent intent) {            if (intent != null) {                // 比较标识是否为中我们想接收的广播,这里做的判断是为了防止出现同时接收到多个我们允许的广播.(即在intent-filter中定义了多个)                if (TextUtils.equals(intent.getAction(), BroadcastActivity.ACTION)) {                    Toast.makeText(context, intent.getStringExtra("msgInfo"), Toast.LENGTH_LONG).show();                }            }        }    }
0 0