项目源码请移步: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,框架和技术实现不妥之处,请帮忙指正),谢谢!