这几天在做一个天气的小demo,其中要显示今天、明天和后天三天的天气情况,每天的天气是一个单独的布局,左右滑动进行切换,因此我用了一个ViewPager将三天的布局装进去。但是最初我是将三天的布局中每个控件一一进行定义,会发现代码很长,而且做了很多重复性的工作,所以我决定将三天的天气布局封装成一个类,通过类的三个实例来实现今天、明天、后天,所以,我做了如下工作:
1、写DayLayout类,继承自FramLayout
package com.example.weather;
import android.content.Context;
import android.graphics.Color;
import android.support.annotation.NonNull;
import android.view.Gravity;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
public class DayLayout extends FrameLayout{
public FrameLayout frameLayout;//传出的布局
public TextView textView_day,textView_degreeMax,textView_degreeMin;//需要更改的控件,外可访问
public ImageView imageView,imageView_sun;//需要更改的控件,外可访问(imageView是背景布局,imageView_sun是天气图标)
private LinearLayout linearLayout,linearLayout_sun,linearLayout_degree;
private TextView textView_sun,textView_degree;
private LinearLayout.LayoutParams layoutParams0,layoutParams,layoutParams1,layoutParams2,layoutParams3;
public DayLayout(@NonNull Context context) {
super(context);
iniMargin(context);
frameLayout=new FrameLayout(context);
frameLayout.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
imageView=new ImageView(context);
imageView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
imageView.setScaleType(ImageView.ScaleType.FIT_XY);
frameLayout.addView(imageView);
//frameLayout.addView(frameLayout_today);
linearLayout=new LinearLayout(context);
linearLayout.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
linearLayout.setOrientation(LinearLayout.VERTICAL);
frameLayout.addView(linearLayout);
textView_day=new TextView(context);
textView_day.setTextSize(30);
textView_day.setTextColor(Color.rgb(255,36,00));
textView_day.setText("2018-09-19");
linearLayout.addView(textView_day,layoutParams);
linearLayout_sun=new LinearLayout(context);
linearLayout.addView(linearLayout_sun,layoutParams0);
textView_sun=new TextView(context);
textView_sun.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT));
textView_sun.setText("天气");
textView_sun.setTextColor(Color.rgb(255,36,00));
textView_sun.setTextSize(30);
linearLayout_sun.addView(textView_sun);
imageView_sun=new ImageView(context);
imageView_sun.setImageResource(R.drawable.sun);
linearLayout_sun.addView(imageView_sun,layoutParams1);
linearLayout_degree=new LinearLayout(context);
linearLayout.addView(linearLayout_degree,layoutParams0);
textView_degree=new TextView(context);
textView_degree.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));
textView_degree.setText("气温");
textView_degree.setTextColor(Color.rgb(255,36,00));
textView_degree.setTextSize(30);
linearLayout_degree.addView(textView_degree);
textView_degreeMax=new TextView(context);
textView_degreeMax.setText("30");
textView_degreeMax.setTextColor(Color.rgb(255,36,00));
textView_degreeMax.setTextSize(30);
linearLayout_degree.addView(textView_degreeMax,layoutParams2);
textView_degreeMin=new TextView(context);
textView_degreeMin.setText("25");
textView_degreeMin.setTextColor(Color.rgb(255,36,00));
textView_degreeMin.setTextSize(30);
linearLayout_degree.addView(textView_degreeMin,layoutParams3);
}
private void iniMargin(Context context ){
int topMargin,leftMargin,rightMargin;
topMargin=dp2px(context,30);
layoutParams0=new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
layoutParams0.gravity=Gravity.CENTER;
layoutParams0.topMargin=topMargin;
topMargin=dp2px(context, 90);
layoutParams=new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
layoutParams.gravity= Gravity.CENTER;
layoutParams.topMargin=topMargin;
rightMargin=dp2px(context,20);
leftMargin=dp2px(context,80);
layoutParams1=new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
layoutParams1.leftMargin=leftMargin;
layoutParams1.rightMargin=rightMargin;
layoutParams1.gravity=Gravity.LEFT;
leftMargin=dp2px(context,70);
layoutParams2=new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
layoutParams2.leftMargin=leftMargin;
leftMargin=dp2px(context,10);
layoutParams3=new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
layoutParams3.leftMargin=leftMargin;
}
public int dp2px(Context context, float dpValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (dpValue * scale + 0.5f);
}
}
2、在主线程中声明
FrameLayout frameLayout;//主界面
ViewPager viewPager;//装载三天的布局
DayLayout dayLayout_today, dayLayout_tomo,dayLayout_atomo;
FrameLayout frameLayout_today,frameLayout_tomo,frameLayout_atomo;
3、主线程的初始化方法iniView()中进行DayLayout的实例化
frameLayout=new FrameLayout(this);
frameLayout.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
viewPager=new ViewPager(this);
viewPager.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
frameLayout.addView(viewPager);
//初始化三天的布局
dayLayout_today=new DayLayout(this);
dayLayout_tomo=new DayLayout(this);
dayLayout_atomo=new DayLayout(this);
frameLayout_today=dayLayout_today.frameLayout;
frameLayout_tomo=dayLayout_tomo.frameLayout;
frameLayout_atomo=dayLayout_atomo.frameLayout;
//将三天的布局加到viewPager
viewList=new ArrayList<>();
viewList.add(frameLayout_today);
viewList.add(frameLayout_tomo);
viewList.add(frameLayout_atomo);
PagerAdapter pagerAdapter=new PagerAdapter() {
@Override
public int getCount() {
return viewList.size();
}
@Override
public boolean isViewFromObject(View view, Object object) {
return view == object;
}
@Override
public void destroyItem(ViewGroup container, int position,
Object object) {
// TODO Auto-generated method stub
container.removeView(viewList.get(position));
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
// TODO Auto-generated method stub
container.addView(viewList.get(position));
return viewList.get(position);
}
};
viewPager.setAdapter(pagerAdapter);
setContentView(frameLayout);
4、好了,下面就可以在主线程中随意使用了
dayLayout_today.textView_day.setText(“2018-09-25”);//明天和后天的内容更新类似
dayLayout_today.textView_degreeMax.setText(“32”);
dayLayout_today.textView_degreeMin.setText(“26”);
dayLayout_today.imageView_sun.setImageResource(R.drawable.cloudy);
dayLayout_today.imageView..setImageResource(R.drawable.cloudyBackground);
5、今天的效果图如下,右滑动是明天的,再右滑是后天的