【2020】Android轮子,99个可以直接拿来用的代码片段(持续更新) - Go语言中文社区

【2020】Android轮子,99个可以直接拿来用的代码片段(持续更新)


【2020】Android轮子,100个可以直接拿来用的代码片段(持续更新)

1.EditText限制输入大于0的金额,其中mBalance是能输入的最大金额

@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
    try {
        if (s.toString().trim().equals(".")) {
            mMoneyEdit.setText("0.");
            mMoneyEdit.setSelection(2);
            return;
        }
        //限制输入两位小时
        if (s.toString().contains(".")) {
            if (s.length() - 1 - s.toString().indexOf(".") > 2) {
                CharSequence input = s.toString().subSequence(0,
                        s.toString().indexOf(".") + 2 + 1);
                mMoneyEdit.setText(input);
                mMoneyEdit.setSelection(input.length());
            }
        }
        //对前面两位做限制,若果已0开头,只能是0.
        if (s.toString().startsWith("0") && s.toString().trim().length() > 1) {
            if (!s.toString().substring(1, 2).equals(".")) {
                mMoneyEdit.setText(s.subSequence(0, 1));
                mMoneyEdit.setSelection(1);
                return;
            }
        }
        //显示输入的值小于金额
        double money = Double.parseDouble(s.toString().trim());
        if (money > RentHelper.Convert2DoubleFee(mBalance)) {
            mMoneyEdit.setText(s.subSequence(0, s.length() - 1));
            mMoneyEdit.setSelection(s.length() - 1);
            return;
        }
    } catch (Exception e) {
        Log.e("TAG",e.getMessage());
    }
}

2.Glide加载相同地址的图片,禁用缓存(需要同时禁用磁盘和内存缓存)

RequestOptions options = new RequestOptions().diskCacheStrategy(DiskCacheStrategy.NONE).skipMemoryCache(true);
   Glide.with(this).load(filePath).apply(options).into(mImageView);

在Androidx中,使用AppCompatTextView使文字大小自适应,重要的是后面的4个属性,不换行要加上maxLines=1,不能使用singleLine=true

<androidx.appcompat.widget.AppCompatTextView
    android:id="@+id/op_hand_record_tv"
    style="@style/order_operation_tv"
    android:drawableLeft="@mipmap/ic_car_64"
    android:text="交接记录"
    android:maxLines="1"
    app:autoSizeMaxTextSize="14sp"
    app:autoSizeMinTextSize="10sp"
    app:autoSizeTextType="uniform" />

4、将app:属性或者自定义控件的属性抽象进style文件,不需要添加android:或者app:前缀。直接写属性即可

<!--订单操作textView的样式-->
<style name="order_operation_tv">
    <item name="android:layout_width">0dp</item>
    <item name="android:layout_weight">1</item>
    <item name="android:layout_height">wrap_content</item>
    <item name="android:textColor">@color/com_tv_color</item>
    <item name="android:textSize">@dimen/size_small</item>
    <item name="android:padding">4dp</item>
    <item name="android:maxLines">1</item>
    <item name="android:gravity">center</item>
    <item name="android:drawablePadding">3dp</item>
    <item name="autoSizeMaxTextSize">14sp</item>
    <item name="autoSizeMinTextSize">10sp</item>
    <item name="autoSizeTextType">uniform</item>
</style>

5、ConstraintLayout内部使用宽高比限制

<ImageView
    android:id="@+id/qr_code_iv"
    android:layout_width="0dp"
    android:layout_height="0dp"
    android:layout_marginTop="@dimen/margin_normal"
    android:src="@mipmap/ic_launcher_round"
    app:layout_constraintDimensionRatio="w,1:1"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/qr_tip_tv"
    app:layout_constraintWidth_percent="0.5" />

在这里插入图片描述
图片居中显示,约束宽度为屏幕宽度的一半,高宽比:1:1

6、自定义Toolbar图标,实现消息小红点,通过自定义ActionProvider实现

step1.新建一个main_menu.xml文件

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <item
        android:id="@+id/menu_msg"
        android:orderInCategory="1"
        android:title="消息"
        app:actionProviderClass="txj.com.carmgr.ui.widget.BadgeActionProvider"
        app:showAsAction="always" />

</menu>

step 2: 实现自定义BadgeActionProvider

/**
 * 自定义menu的视图
 */
public class BadgeActionProvider extends ActionProvider {
    private ImageView mIconIv;
    private TextView mCountTv;
    private Context context;
    private onBadgeMenuClickListener onClickListener;
    public BadgeActionProvider(Context context) {
        super(context);
        this.context = context;
    }

    @Override
    public View onCreateActionView() {
        int toolbarHeight = YUtil.INSTANCE.getToolbarHeight(context);
        //设置自定义布局的宽高为Toolbar的高度
        ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams(toolbarHeight, toolbarHeight);
        View view = LayoutInflater.from(context)
                .inflate(R.layout.menu_badge_provider, null, false);
        view.setLayoutParams(layoutParams);
        mIconIv = view.findViewById(R.id.icon_iv);
        mCountTv = view.findViewById(R.id.count_tv);
        view.setOnClickListener(onViewClickListener);
        return view;
    }

    // 点击处理。
    private View.OnClickListener onViewClickListener = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (onClickListener != null)
                onClickListener.onClick();
        }
    };

    // 外部设置监听。
    public void setOnClickListener(onBadgeMenuClickListener onClickListener) {
        this.onClickListener = onClickListener;
    }

    // 设置图标。
    public void setIcon(@DrawableRes int icon) {
        mIconIv.setImageResource(icon);
    }

    // 设置显示的数字。
    public void setBadge(long count) {
        if (count > 0) {
            mCountTv.setText(Long.toString(count));
            mCountTv.setVisibility(View.VISIBLE);
        } else {
            mCountTv.setVisibility(View.GONE);
        }
    }
    
    // 设置显示的文字。
    public void setText(CharSequence i) {
        mCountTv.setText(i);
    }

    public interface onBadgeMenuClickListener {
        void onClick();
    }
}

step 3: 实现布局文件

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="?actionBarItemBackground">

    <ImageView
        android:id="@+id/icon_iv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_centerVertical="true"
        android:layout_marginRight="14dp"
        app:srcCompat="@drawable/ic_message_white_24dp" />

    <TextView
        android:id="@+id/count_tv"
        android:layout_width="18dp"
        android:layout_height="18dp"
        android:layout_alignParentTop="true"
        android:layout_alignParentRight="true"
        android:layout_marginTop="2dp"
        android:layout_marginRight="8dp"
        android:background="@mipmap/ic_point_red"
        android:gravity="center"
        android:text="18"
        android:textColor="@android:color/white"
        android:textSize="12sp"
        android:visibility="gone" />
</RelativeLayout>

step 4: 在Fragment或者Activity的onCreateOptionsMenu()中使用

override fun onCreateOptionsMenu(menu: Menu?, inflater: MenuInflater?) {
    inflater?.inflate(R.menu.main_menu, menu)
    val menuItem = menu?.findItem(R.id.menu_msg)
    mActionProvider = MenuItemCompat.getActionProvider(menuItem) as BadgeActionProvider
    mActionProvider?.setOnClickListener {
        val direction = MainFragmentDirections.actionMainFragToMessageFrag()
        Navigation.findNavController(mBinding.root).navigate(direction)
    }// 设置点击监听。
    //延迟2秒刷新消息数
    GlobalScope.launch(Dispatchers.Main) {
        delay(2000)
        mActionProvider?.let {
            val count = YUtil.getUnReadmsgCount()
            it.setBadge(count)
        }
    }
    super.onCreateOptionsMenu(menu, inflater)
}

7、代码设置背景色

        GradientDrawable dg = new GradientDrawable();
        dg.setCornerRadius(DimenUtil.dip2px(this, 4));
        dg.setColor(ColorUtils.getColor(R.color.white));
        getView(R.id.fl_wheel_bg).setBackground(dg);
版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/weixin_46055193/article/details/103703292
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢