zoukankan      html  css  js  c++  java
  • 安卓学习68

    layout 资源包含,,,android 开发必读

    有时候我们在一个Android 程序中可能会复用布局文件,这时可以在一个xml 文件中复用过去的布局文件,但是和常规

    的使用不同的是,需要加上类似包含头文件一样的include 关键字,比如下面我们需要包含layout 文件夹下的view.xml 布

    局文件,需要 这样下,完整的如下,大家可以试一试。

    encoding="utf-8"?>

    android:orientation="vertical"

    android:layout_width="fill_parent"

    android:layout_height="fill_parent"

    >

    <textview< p="">

    android:layout_width="wrap_content"

    android:layout_height="wrap_content"

    android:text="@string/cwj"

    />

    <textview< p="">

    android:layout_width="wrap_content"

    android:layout_height="wrap_content"

    android:text="@string/android123"

    />

    48.Android 控件开发之ToggleButton 原理原理

    在Android 平台上比较有特色的就是ToggleButton 控件,虽然它的功能和CheckBox 有些类似,但是他们的用处还是有

    一定的区别比如ToggleButton 原本有图片装饰,通过ToggleButton 可以很清楚的显示某些状态。它们均从Button 为基类

    的CompoundButton 中实现,其真假事件从Checkable 来实现。

    public abstract class CompoundButton extends Button implements Checkable {

    private boolean mChecked; //状态是否选中

    private int mButtonResource;

    private boolean mBroadcasting;

    private Drawable mButtonDrawable; //按钮的图标

    private OnCheckedChangeListener mOnCheckedChangeListener; //选中状态改变监听

    private OnCheckedChangeListener mOnCheckedChangeWidgetListener;

    private static final int[] CHECKED_STATE_SET = {

    R.attr.state_checked

    };

    public CompoundButton(Context context) {

    this(context, null);

    }

    public CompoundButton(Context context, AttributeSet attrs) {

    this(context, attrs, 0);

    }

    public CompoundButton(Context context, AttributeSet attrs, int defStyle) {

    super(context, attrs, defStyle);

    TypedArray a =context.obtainStyledAttributes(attrs, http://www.doczj.com/doc/f563ff3efe4733687e21aae8.htmlpoundButton,

    defStyle, 0);

    Drawable d = a.getDrawable(http://www.doczj.com/doc/f563ff3efe4733687e21aae8.htmlpoundButton_button);

    if (d != null) {

    setButtonDrawable(d);

    }

    boolean checked = a .getBoolean(http://www.doczj.com/doc/f563ff3efe4733687e21aae8.htmlpoundButton_checked, false); setChecked(checked);

    a.recycle(); //显式的GC

    }

    public void toggle() {

    setChecked(!mChecked);

    }

    @Override

    public boolean performClick() {

    toggle();

    return super.performClick();

    }

    public boolean isChecked() {

    return mChecked;

    }

    public void setChecked(boolean checked) {

    if (mChecked != checked) {

    mChecked = checked;

    refreshDrawableState(); //更新当前状态的按钮图标

    if (mBroadcasting) {

    return;

    }

    mBroadcasting = true;

    if (mOnCheckedChangeListener != null) { mOnCheckedChangeListener.onCheckedChanged(this, mChecked);

    }

    if (mOnCheckedChangeWidgetListener != null) { mOnCheckedChangeWidgetListener.onCheckedChanged(this, mChecked);

    }

    mBroadcasting = false;

    }

    }

    public void setOnCheckedChangeListener(OnCheckedChangeListener listener) { mOnCheckedChangeListener = listener;

    }

    void setOnCheckedChangeWidgetListener(OnCheckedChangeListener listener) { mOnCheckedChangeWidgetListener = listener;

    }

    public static interface OnCheckedChangeListener {

    void onCheckedChanged(CompoundButton buttonView, boolean isChecked); }

    public void setButtonDrawable(int resid) {

    if (resid != 0 && resid == mButtonResource) {

    return;

    }

    mButtonResource = resid;

    Drawable d = null;

    if (mButtonResource != 0) {

    d = getResources().getDrawable(mButtonResource);

    }

    setButtonDrawable(d);

    }

    public void setButtonDrawable(Drawable d) {

    if (d != null) {

    if (mButtonDrawable != null) {

    mButtonDrawable.setCallback(null);

    unscheduleDrawable(mButtonDrawable) ;

    }

    d.setCallback(this);

    d.setState(getDrawableState());

    d.setVisible(getVisibility() == VISIBLE, false);

    mButtonDrawable = d;

    mButtonDrawable.setState(null);

    setMinHeight(mButtonDrawable.getIntrinsicHeight());

    }

    refreshDrawableState();

    }

    @Override

    public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) { boolean populated = super.dispatchPopulateAccessibilityEvent(event);

    if (!populated) {

    int resourceId = 0;

    if (mChecked) {

    resourceId = R.string.accessibility_compound_button_selected;

    } else {

    resourceId = R.string.accessibility_compound_button_unselected;

    }

    String state = getResources().getString(resourceId);

    event.getText().add(state);

    event.setChecked(mChecked);

    }

    return populated;

    }

    @Override

    protected void onDraw(Canvas canvas) {

    super.onDraw(canvas);

    final Drawable buttonDrawable = mButtonDrawable;

    if (buttonDrawable != null) {

    final int verticalGravity = getGravity() & Gravity.VERTICAL_GRAVITY_MASK;

    final int height = buttonDrawable.getIntrinsicHeight();

    int y = 0;

    switch (verticalGravity) {

    case Gravity.BOTTOM:

    y = getHeight() - height;

    break;

    case Gravity.CENTER_VERTICAL:

    y = (getHeight() - height) / 2;

    break;

    }

    buttonDrawable.setBounds(0, y, buttonDrawable.getIntrinsicWidth(), y + height); buttonDrawable.draw(canvas);

    }

    }

    @Override

    protected int[] onCreateDrawableState(int extraSpace) {

    final int[] drawableState = super.onCreateDrawableState(extraSpace + 1);

    if (isChecked()) {

    mergeDrawableStates(drawableState, CHECKED_STATE_SET);

    }

    return drawableState;

    }

    @Override

    protected void drawableStateChanged() { //android123 提示状态改变时需要更换按钮的图标super.drawableStateChanged();

    if (mButtonDrawable != null) {

    int[] myDrawableState = getDrawableState();

    mButtonDrawable.setState(myDrawableState);

    invalidate();

    }

    }

    @Override

    protected boolean verifyDrawable(Drawable who) {

    return super.verifyDrawable(who) || who == mButtonDrawable;

    }

    static class SavedState extends BaseSavedState {

    boolean checked;

    SavedState(Parcelable superState) {

    super(superState);

    }

    private SavedState(Parcel in) {

    super(in);

    checked = (Boolean)in.readValue(null);

    }

    @Override

    public void writeToParcel(Parcel out, int flags) {

    super.writeToParcel(out, flags);

    out.writeValue(checked);

    }

    @Override

    public String toString() {

    return "CompoundButton.SavedState{"

    + Integer.toHexString(System.identityHashCode(this))

    + " checked=" + checked + "}";

    }

    public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { public SavedState createFromParcel(Parcel in) {

    return new SavedState(in);

    }

    public SavedState[] newArray(int size) {

    return new SavedState[size];

    }

    }

    @Override

    public Parcelable onSaveInstanceState() {

    // Force our ancestor class to save its state

    setFreezesText(true);

    Parcelable superState = super.onSaveInstanceState();

    SavedState ss = new SavedState(superState);

    ss.checked = isChecked();

    return ss;

    }

    @Override

    public void onRestoreInstanceState(Parcelable state) {

    SavedState ss = (SavedState) state;

    super.onRestoreInstanceState(ss.getSuperState());

    setChecked(ss.checked);

    requestLayout();

    }

    }

    从上面来看我们知道CompuundButton 的实现相对繁琐了些,主要是考虑状态是否已经选中等情况的消息通知,Android

    开发网提醒大家而ToggleButton 相对CompuundButton 增加的给用户而言主要是开关的文字显示。

    public class ToggleButton extends CompoundButton {

    private CharSequence mTextOn;

    private CharSequence mTextOff;

    private Drawable mIndicatorDrawable;

    private static final int NO_ALPHA = 0xFF;

    private float mDisabledAlpha;

    public ToggleButton(Context context, AttributeSet attrs, int defStyle) {

    super(context, attrs, defStyle);

    TypedArray a =context.obtainStyledAttributes(

    attrs, com.android.internal.R.styleable.ToggleButton, defStyle, 0);

    mTextOn = a.getText(com.android.internal.R. styleable.ToggleButton_textOn);

    mTextOff = a.getText(com.android.internal.R.styleable.ToggleButton_textOff);

    mDisabledAlpha = a.getFloat(com.android.internal.R.styleable.ToggleButton_disabledAlpha, 0.5f) ; syncTextState();

    a.recycle();

    }

    public ToggleButton(Context context, AttributeSet attrs) {

    this(context, attrs, com.android.internal.R.attr.buttonStyleToggle);

    }

    public ToggleButton(Context context) {

    this(context, null);

    @Override

    public void setChecked(boolean checked) {

    super.setChecked(checked);

    syncTextState();

    }

    private void syncTextState() {

    boolean checked = isChecked();

    if (checked && mTextOn != null) {

    setText(mTextOn);

    } else if (!checked && mTextOff != null) {

    setText(mTextOff);

    }

    }

    public CharSequence getTextOn() {

    return mTextOn;

    }

    public void setTextOn(CharSequence textOn) {

    mTextOn = textOn;

    }

    public CharSequence getTextOff() {

    return mTextOff;

    }

    protected void onFinishInflate() {

    super.onFinishInflate();

    updateReferenceToIndicatorDrawable(getBackground());

    }

    @Override

    public void setBackgroundDrawable(Drawable d) {

    super.setBackgroundDrawable(d);

    updateReferenceToIndicatorDrawable(d);

    }

    private void updateReferenceToIndicatorDrawable(Drawable backgroundDrawable) {

    if (backgroundDrawable instanceof LayerDrawable) {

    LayerDrawable layerDrawable = (LayerDrawable) backgroundDrawable; mIndicatorDrawable =layerDrawable.findDrawableByLayerId(com.android.internal.R.id.toggle); }

    }

    @Override

    protected void drawableStateChanged() {

    super.drawableStateChanged();

    if (mIndicatorDrawable != null) {

    mIndicatorDrawable.setAlpha(isEnabled() ? NO_ALPHA : (int) (NO_ALPHA * mDisabledAlpha)); }}

  • 相关阅读:
    [译]微服务-Martin Fowler(转)
    SpringBoot注解最全详解(整合超详细版本)(转)
    操作系统中的句柄是什么?(转)
    用户态和核心态(转)
    进程、线程、协程(转)
    IO中同步与异步,阻塞与非阻塞区别(转)
    HTML5常见的取值与单位
    C++实现词法分析器
    用C语言编写一个简单的词法分析程序
    Java面向对象详解
  • 原文地址:https://www.cnblogs.com/092e/p/14916852.html
Copyright © 2011-2022 走看看