拆分界面 ScrollView +FramLayout.addView方式(ScrollView+LinearLayout可以展示内容超过界面大小)

博客主要讲述了Activity向几个FrameLayout中添加View进行展示的内容,还提及了BaseMoudle和4个子Moudlue。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Activity 向几个FramLayout 中添加View来展示

public class DetailActivity extends Activity {
    @BindView(R.id.fl_app_info)
    FrameLayout flAppInfo;

    @BindView(R.id.fl_app_safe)
    FrameLayout flAppSafe;

    @BindView(R.id.fl_app_pic)
    FrameLayout flAppPic;

    @BindView(R.id.fl_app_des)
    FrameLayout flAppDes;

    @BindView(R.id.scrollview)
    ScrollView scrollview;

    private String packagename;
    private LoadingPage loadingPage;
    private HomeInfo.AppInfo detailAppInfo;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        packagename = getIntent().getStringExtra("packagename");

        loadingPage = new LoadingPage(UIUitls.getContext()) {
            @Override
            public ResultState onLoad() {
                return onSubLoad();
            }

            @Override
            public View onCreateSuccessedView() {
                return onSubCreateSuccessedView();
            }
        };
        //因为在loadingPage中包含了4中界面展示情况,所以将loadingPage作为activity页面显示内容
        setContentView(loadingPage);

        //在show方法中会触发onLoad方法,在onLoad方法中需要请求网络获取结果,结果还必须是(ResultState)限定类型
        loadingPage.show();
    }

    private View onSubCreateSuccessedView() {
        View view = UIUitls.inflate(R.layout.activity_detail);
        ButterKnife.bind(this,view);

        //1 将顶部应用基本信息添加至帧布局中
        AppInfoModule appInfoModule = new AppInfoModule(UIUitls.getContext());
        appInfoModule.bindData(detailAppInfo);
        flAppInfo.addView(appInfoModule.view);
        //2 安全相关
        AppSafeModule appSafeModule = new AppSafeModule(UIUitls.getContext());
        appSafeModule.bindData(detailAppInfo);
        flAppSafe.addView(appSafeModule.view);
        //3 图片相关
        AppPicModule appPicModule = new AppPicModule(UIUitls.getContext());
        appPicModule.bindData(detailAppInfo);
        flAppPic.addView(appPicModule.view);
        //4 详情相关
        AppDesModule appDesModule = new AppDesModule(UIUitls.getContext(),scrollview);
        appDesModule.bindData(detailAppInfo);
        flAppDes.addView(appDesModule.view);
        return view;
    }

    private LoadingPage.ResultState onSubLoad() {
        DetailProtocol detailProtocol = new DetailProtocol();
        detailAppInfo = detailProtocol.getData(
                "detail", 0, "&packageName=" + packagename);
        if (detailAppInfo == null) {
            return LoadingPage.ResultState.RESULT_STATE_ERROR;
        }
        return LoadingPage.ResultState.RESULT_STATE_SUCCESSED;
    }
}

2 BaseMoudle和4个子Moudlue

public abstract class BaseModule<T>{
    private Context mCtx;
    public View view;

    public BaseModule(Context ctx){
        this.mCtx = ctx;
        view = initView();
    }
    //因为在父类中不知道详情4个拆分出来模块的具体布局效果
    public abstract View initView();
    //因为在父类中不知道详情4个拆分出来模块的具体数据也不知道控件有哪些,所以提供一个给控件填充数据方法
    public abstract void bindData(T t);
}

子Moudlue

public class AppPicModule extends BaseModule<HomeInfo.AppInfo> {
    @BindView(R.id.ll_pic)
    LinearLayout llPic;
    private ArrayList<String> screenList;

    public AppPicModule(Context ctx) {
        super(ctx);
    }

    @Override
    public View initView() {
        View view = UIUitls.inflate(R.layout.layout_app_pic);
        ButterKnife.bind(this,view);
        return view;
    }

    @Override
    public void bindData(HomeInfo.AppInfo appInfo) {
        screenList = (ArrayList<String>) appInfo.getScreen();
        llPic.removeAllViews();
        int width = UIUitls.dip2px(90);
        int height = UIUitls.dip2px(150);
        int margin = UIUitls.dip2px(6);
        LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(width, height);
        for (int i = 0; i < screenList.size(); i++) {
            ImageView imageView = new ImageView(UIUitls.getContext());
            Glide.with(UIUitls.getContext())
                    .load(Constant.IMG+ screenList.get(i)).into(imageView);
            params.setMargins(margin,margin,0,margin);
            llPic.addView(imageView,params);

            final int finalI = i;
            imageView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent intent = new Intent(UIUitls.getContext(), ImageScaleActivity.class);
                    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    intent.putExtra("screenList", screenList);
                    intent.putExtra("index", finalI);
                    UIUitls.getContext().startActivity(intent);
                }
            });
        }
    }
}

 

分析下列代码:package com.example.emptytapo import android.graphics.Color import android.graphics.Typeface import android.os.Bundle import android.view.Gravity import androidx.fragment.app.Fragment import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.LinearLayout import android.widget.ScrollView import android.widget.TextView // TODO: Rename parameter arguments, choose names that match // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER class RegionFragment : Fragment() { private lateinit var scrollView:ScrollView private lateinit var container: LinearLayout private lateinit var letterIndex: LinearLayout private val letterMap = mutableMapOf<String, View>() // 保存字母锚点位置 override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View { return inflater.inflate(R.layout.fragment_region, container, false) } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { scrollView = view.findViewById(R.id.scrollView) container = view.findViewById(R.id.countryContainer) letterIndex = view.findViewById(R.id.letterIndex) val countryList = getCountryList() addCountryViews(countryList) setupLetterBar() } private fun addCountryViews(list: List<CountryItem>) { for (item in list) { if (item.name.isEmpty()) { // 分隔标题 val letterView = TextView(requireContext()).apply { text = item.letter setTypeface(null, Typeface.BOLD) setPadding(16, 32, 16, 16) textSize = 18f } container.addView(letterView) letterMap[item.letter] = letterView } else { // 普通国家 val countryView = TextView(requireContext()).apply { text = item.name setPadding(32, 16, 16, 16) textSize = 16f } container.addView(countryView) } } } private fun setupLetterBar() { for (ch in 'A'..'Z') { val letter = ch.toString() val textView = TextView(requireContext()).apply { text = letter textSize = 12f gravity = Gravity.CENTER setPadding(0, 6, 0, 6) setTextColor(Color.GRAY) setOnClickListener { letterMap[letter]?.let { anchor -> scrollView.post { scrollView.smoothScrollTo(0, anchor.top) } } } } letterIndex.addView(textView) } } }改为按照英文首选进行分隔
最新发布
08-08
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值