Android将布局封装成类

这几天在做一个天气的小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、今天的效果图如下,右滑动是明天的,再右滑是后天的
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值