高德天气应用开发之三:android 自定义控件实现(ActionBar + PageIndicatorView)

版权声明:本文为博主原创文章,未经允许不得转载,如有问题,欢迎指正,谢谢! https://blog.csdn.net/cbk861110/article/details/86665790

项目源码请移步:https://github.com/caobaokang419/WeatherApp(欢迎Github Fork&Star,框架和技术实现不妥之处,请帮忙指正),谢谢!

基于MVVM框架的高德天气APP:


功能点实现说明:

  • 公共控件封装:自定义实现公共控件CommonUI,用于控件复用;

一:自定义控件的作用:

用于控件复用,保持应用UI的风格一致性,及代码的可移植性和可维护性。

二. 自定义控件的实现方式(以ActionBar为例,其他公共控件实现可参照源码):

1. ActionBar.java

public class ActionBar extends RelativeLayout {
    private LayoutInflater mInflater;
    private RelativeLayout mActionBarView;
    private TextView mTitleView;
    private View mLeftActionView;
    private View mRightActionView;

    public ActionBar(Context context, AttributeSet attrs) {
        super(context, attrs);

        mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        mActionBarView = (RelativeLayout) mInflater.inflate(R.layout.actionbar, null);
        addView(mActionBarView);

        mTitleView = (TextView) mActionBarView.findViewById(R.id.tv_title);
        mLeftActionView = (ImageView) mActionBarView.findViewById(R.id.iv_left);
        mRightActionView = (ImageView) mActionBarView.findViewById(R.id.iv_right);

        /*custom attrs*/
        TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.actionBar);
        if (typedArray != null) {
            CharSequence title = typedArray.getString(R.styleable.actionBar_tv_title_str);
            setTitle(title);

            Drawable iv_left = typedArray.getDrawable(R.styleable.actionBar_iv_left_icon);
            if (iv_left != null) {
                mLeftActionView.setBackground(iv_left);
            }

            Drawable iv_right = typedArray.getDrawable(R.styleable.actionBar_iv_right_icon);
            if (iv_right != null) {
                mRightActionView.setBackground(iv_right);
            }

            typedArray.recycle();
        }
    }

    public void setLeftOnClickListener(View.OnClickListener listener) {
        if (null != mLeftActionView) {
            mLeftActionView.setOnClickListener(listener);
        }
    }

    public void setRightOnClickListener(View.OnClickListener listener) {
        if (null != mRightActionView) {
            mRightActionView.setOnClickListener(listener);
        }
    }

    public void setTitle(CharSequence title) {
        if (title != null) {
            mTitleView.setText(title);
        }
    }

    public void setTitle(int resid) {
        mTitleView.setText(resid);
    }
}

2. 自定义布局文件actionbar.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/action_bar"
    android:gravity="center_vertical"
    style="@style/ActionBar">

    <ImageView
        android:id="@+id/iv_left"
        style="@style/ActionBarItem"
        android:layout_marginStart="@dimen/actionbar_item_magrin"
        android:layout_alignParentStart="true" />

    <TextView
        android:id="@+id/tv_title"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:gravity="center"
        android:text="title"
        android:textColor="@color/actionbar_title"
        android:textSize="32dip" />

    <ImageView
        android:id="@+id/iv_right"
        style="@style/ActionBarItem"
        android:layout_marginEnd="@dimen/actionbar_item_magrin"
        android:layout_alignParentEnd="true" />
</RelativeLayout>

3. 自定义属性:

<declare-styleable name="actionBar">
    <attr name="tv_title_str" format="string"/>
    <attr name="iv_left_icon" format="reference"/>
    <attr name="iv_right_icon" format="reference"/>
</declare-styleable>

三. 自定义控件的使用

1. xml 加载activity_weather_main.xml:

<com.example.commonui.ActionBar xmlns:actionbar="http://schemas.android.com/apk/res-auto"
    android:id="@+id/action_bar"
    android:layout_width="match_parent"
    android:layout_height="@dimen/actionbar_height"
    android:background="@color/actionbar_background"
    android:gravity="center_vertical"
    actionbar:iv_left_icon="@drawable/ic_action_bar_left"
    actionbar:iv_right_icon="@drawable/ic_action_bar_right"
    actionbar:tv_title_str="深圳" />

2. 代码客制化WtMainActivity.java:

mActionBar = findViewById(R.id.action_bar);
mActionBar.setLeftOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        LogUtils.d("onClickedLeftBtn()");
        WtUtil.startActivity(getApplicationContext(), WtSearchActivity.class);
    }
});

mActionBar.setRightOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        LogUtils.d("onClickedRightBtn()");
        WtUtil.startActivity(getApplicationContext(), WtSettingActivity.class);
    }
});

-------------------------------------------

文章目录(未完,待续):

一:android 应用子功能及移动框架总述 https://blog.csdn.net/cbk861110/article/details/86665564

二:android 高德天气API说明及城市天气查询实现 https://blog.csdn.net/cbk861110/article/details/86665655

三:android 自定义控件实现(ActionBar + PageIndicatorView) https://blog.csdn.net/cbk861110/article/details/86665790

四:android ViewPager实现左右页面滑动切换 https://blog.csdn.net/cbk861110/article/details/86665964

五:android应用权限动态申请 https://blog.csdn.net/cbk861110/article/details/86666321

六:android RecyclerView 封装及使用 https://blog.csdn.net/cbk861110/article/details/86666392

七:android Xutils3文件下载实现(高德天气城市配置) https://blog.csdn.net/cbk861110/article/details/86666573

八:android DiskLruCache 磁盘缓存 封装和使用 https://blog.csdn.net/cbk861110/article/details/86666664

九:android ThreadPoolExecutor线程池 封装及使用  https://blog.csdn.net/cbk861110/article/details/86667101

十:android 天气网络请求框架(retrofit2&okhttp3&Gson) 封装及使用  https://blog.csdn.net/cbk861110/article/details/86667375

十一:android RxAndroid(响应式编程) 异步网络请求实现 https://blog.csdn.net/cbk861110/article/details/86669178

十二:android DataBinding 数据和UI双向绑定实现 https://blog.csdn.net/cbk861110/article/details/86669708

十三:android room数据库 天气数据读写实现 https://blog.csdn.net/cbk861110/article/details/86670354

十四:android LiveData 使用方法(实现城市天气自动刷新) https://blog.csdn.net/cbk861110/article/details/86670531

十五:android ViewModel 使用方法 https://blog.csdn.net/cbk861110/article/details/86670703

十六:android 集成友盟消息推送机制(U-Push) https://blog.csdn.net/cbk861110/article/details/86683849

--------------------- 

【版权说明】

1. 请支持原创,转载请注明出处:https://blog.csdn.net/cbk861110/article/details/86665564

2. 项目源码&框架说明&技术更新实现 请移步:https://github.com/caobaokang419/WeatherApp(欢迎Github Fork&Star,框架和技术实现不妥之处,请帮忙指正),谢谢!

猜你喜欢

转载自blog.csdn.net/cbk861110/article/details/86665790