Android笔记

2019-07-25,工作半年。 第一次写博客。为了记录自己在工作中遇到的问题和解决的办法思路。加深印象和方便以后复习。不面向萌新。

一、屏幕适配,动态设置view位置

情景再现(2019-07-25)

xml布局:父布局Relativelayout,子布局:3个Relativelayout。
实现效果Android笔记_第1张图片
如图:上白(记为R1)下黑(记为R2),用layout_weight属性,在竖直方向比例分布。黄色圆形Relativelayou(记为R3)t的圆心要在他们的交线上。并且水平方向居中。
考虑到 屏幕适配 的问题,不能直接对R3使用margin_bottom属性。


解决思路
  1. 拿到view。
  2. 在Activity中,拿到 R2顶部 距 父布局R1 顶部 的距离,拿到父布局R1的宽度。这里R1是match_parent,所以这里的宽度,就是手机屏幕的宽度。
  3. 使用LayoutParams类来设置R3的位置。因为R3的父容器是R1,所以使用RelativeLayoutParams。
  4. 注意: 在得到view的宽高时,要在view测量完之后才能拿到真正的数值,否则得到的结果为0。可以在onResume()中得到。

代码
Activity{
	onCreate(){
		findViews();
	}
	onResume(){
		 //RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) rl_start.getLayoutParams();
        RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
        DisplayMetrics dm = getResources().getDisplayMetrics();
        params.height = dm.widthPixels / 4;
        params.width = dm.widthPixels / 4;//自身宽度
        params.topMargin = R2.getTop() - dm.widthPixels / 8;//上边距:R2.getTop() - 自身宽度/2
        params.leftMargin = dm.widthPixels / 2 - dm.widthPixels / 8;//左边距:屏幕宽度/2 - 自身宽度/2
        R3.setLayoutParams(params);
	}


}

二、实时监听网络连接状态

情景再现(2019-07-26)

如标题所述,需要监听网络的连接状态,并作出相应的处理。

解决思路

找轮子 => Android 实时监测网络,网络变化监听 适配7.0方案
监听网络变化的广播类已经有了。

代码

如何使用:

 //定义一个方法
 private void initNetworkReceiver() {
        networkReceiver = new NetworkReceiver(getActivity(),new NetworkReceiver.NetworkCallback() {
            @Override
            public void onAvailable() {
                Toast.makeText(getActivity(), "网络已连接", Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onLost() {
                //显示一个Dialog,让用户去设置,我用的是style为Dialog的Activity
                startActivity(new Intent(getActivity(), NetDialogActivity.class));

            }
        });
    }

    @Override//在Activity中
    public void onDestroy() {
        super.onDestroy();
        networkReceiver.unRegister(getActivity());

    }
     @Override//在Fragment中
    public void onDestroyView() {
        super.onDestroyView();
        isInit = false;
        isLoad = false;
        networkReceiver.unRegister(getActivity());
    }

NetDialogActivity代码

package com.yagu.finance.activity;

import android.content.Intent;
import android.os.Bundle;
import android.provider.Settings;
import android.widget.Toast;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;

import com.yagu.finance.R;
import com.yagu.finance.broadcast.NetworkReceiver;


public class NetDialogActivity extends AppCompatActivity {
    
    private NetworkReceiver networkReceiver;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_setting_net);

        findViewById(R.id.btn_wifi).setOnClickListener(v -> {
            startActivity(new Intent(Settings.ACTION_WIFI_SETTINGS)); //直接进入手机中的wifi网络设置界面
        });
        findViewById(R.id.tv_close).setOnClickListener(v -> {
            finish();
        });

        findViewById(R.id.btn_confirm).setOnClickListener(v -> {

            startActivity(new Intent(Settings.ACTION_AIRPLANE_MODE_SETTINGS));


        });
        checkNet();
    }

    public void checkNet(){

        networkReceiver = new NetworkReceiver(this, new NetworkReceiver.NetworkCallback() {
            @Override
            public void onAvailable() {
                Toast.makeText(NetDialogActivity.this, "网络已连接", Toast.LENGTH_SHORT).show();
                finish();
            }

            @Override
            public void onLost() {
                //startActivity(new Intent(NetDialogActivity.this,NetDialogActivity.class));
            }
        });
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        networkReceiver.unRegister(this);
    }


}

在AndroidManifest中给NetDialogActivity 设置主题

		

主题代码


    

你可能感兴趣的:(android笔记,笔记)