1,判斷 RecyclerView滑動到底部
loadingMoreListener = new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
if(!loading && !recyclerView.canScrollVertically(1)){
loading = true;
loadMoreDate();
}
}
}
2,android studio 3.1版本依賴庫中的libs jar 檔案正确依賴方法為 api 。而不是
implementation
https://stackoverflow.com/questions/49628149/import-class-from-3rd-party-library-android-studio-3-1-graddle-3-1?utm_medium=organic&utm_source=google_rich_qa&utm_campaign=google_rich_qa
這是最新版as3.1發現的問題。
3,view加陰影需要設定背景顔色和elevation屬性值
4,模拟touch事件
val motionEvent = MotionEvent.obtain(
SystemClock.uptimeMillis(),
SystemClock.uptimeMillis() + 100,
MotionEvent.ACTION_UP,
0f,
0f,
)
video_view.dispatchTouchEvent(motionEvent)
5,跳轉應用市場評分
lin_shop.setOnClickListener {
val appPackageName = packageName // getPackageName() from Context or Activity object
try {
startActivity(Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=$appPackageName")))
} catch (anfe: android.content.ActivityNotFoundException) {
startActivity(Intent(Intent.ACTION_VIEW, Uri.parse("https://www.daywin.tv")))
}
}
6,使用系統的播放視訊控件videoview,點選事件需要使用touch方法。onclick是沒有效果的
video_view.setOnTouchListener { p0, p1 ->
when (p1?.action) {
MotionEvent.ACTION_UP -> {
if (fullscreen) {//全屏點選隐藏按鈕
hideControl()
if (lin_hd_choose.visibility == View.VISIBLE) {//隐藏畫質
lin_hd_choose.visibility = View.GONE
}
}
}
}
true
}
7,設定textview字型大小
text.setTextSize(TypedValue.COMPLEX_UNIT_SP, 13f)
8,根據名字擷取drawable的檔案
resources.getIdentifier("lunch", "drawable", packageName)
9,recycleView 單選,不用通過notifyDataSetChanged()方法
var selectedPos = 0
override fun onBindViewHolder(holder: RecyclerView.ViewHolder?, position: Int) {
if (holder is ViewHolder) {
holder.apply {
//選擇效果
if (selectedPos == position) {
lin.isSelected = true
} else {
lin.isSelected = false
}
lin.setOnClickListener {
//選擇效果
notifyItemChanged(selectedPos)
selectedPos = layoutPosition
notifyItemChanged(selectedPos)
}
}
}
}
10 recycleView加邊距
article_recycle.addItemDecoration(object : RecyclerView.ItemDecoration() {
override fun getItemOffsets(outRect: Rect, view: View, parent: RecyclerView, state: RecyclerView.State) {
super.getItemOffsets(outRect, view, parent, state)
outRect.set(0, 30, 0, 0)
}
})
11 NestedScrollView 嵌套recycleView滑動卡頓解決方法
var grid = GridLayoutManager(activity, 2)
grid.isAutoMeasureEnabled = true
home_recycle.layoutManager = grid
home_recycle.isNestedScrollingEnabled = false
12,設定tablayout的下劃線和文字一樣長度
public static void wrapTabIndicatorToTitle(TabLayout tabLayout, int externalMargin, int internalMargin) {
View tabStrip = tabLayout.getChildAt(0);
if (tabStrip instanceof ViewGroup) {
ViewGroup tabStripGroup = (ViewGroup) tabStrip;
int childCount = ((ViewGroup) tabStrip).getChildCount();
for (int i = 0; i < childCount; i++) {
View tabView = tabStripGroup.getChildAt(i);
//set minimum width to 0 for instead for small texts, indicator is not wrapped as expected
tabView.setMinimumWidth(0);
// set padding to 0 for wrapping indicator as title
tabView.setPadding(0, tabView.getPaddingTop(), 0, tabView.getPaddingBottom());
// setting custom margin between tabs
if (tabView.getLayoutParams() instanceof ViewGroup.MarginLayoutParams) {
ViewGroup.MarginLayoutParams layoutParams = (ViewGroup.MarginLayoutParams) tabView.getLayoutParams();
if (i == 0) {
// left
setMargin(layoutParams, externalMargin, internalMargin);
} else if (i == childCount - 1) {
// right
setMargin(layoutParams, internalMargin, externalMargin);
} else {
// internal
setMargin(layoutParams, internalMargin, internalMargin);
}
}
}
tabLayout.requestLayout();
}
}
public static void setMargin(ViewGroup.MarginLayoutParams layoutParams, int start, int end) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
layoutParams.setMarginStart(start);
layoutParams.setMarginEnd(end);
} else {
layoutParams.leftMargin = start;
layoutParams.rightMargin = end;
}
}
13 顯示密碼
edt_password.transformationMethod = PasswordTransformationMethod.getInstance()
隐藏密碼
edt_password.transformationMethod = HideReturnsTransformationMethod.getInstance()
14,從網絡下載下傳檔案,java代碼報錯Assignments are not expressions,and only expressions are allowed in this context
解決方法
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICM38CXlZHbvN3cpR2Lc1TPB10QGtWUCpEMJ9CXsxWam9CXwADNvwVZ6l2c052bm9CXUJDT1wkNhVzLcRnbvZ2Lc1TP3lFcONjW1Z1RhpHbXlla1clWv5kMMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2LcRHelR3LcJzLctmch1mclRXY39TOycTO0MjM0EDMxkDM4EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
do {
byteCount = inputStream.read(buffer)
if (byteCount == -1) {
break
}
os.write(buffer, 0, byteCount)
} while (true)
14,複制文本
val clipboard = getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
val clip = ClipData.newPlainText("label",bank_no.text.toString())
clipboard.primaryClip = clip
toa(getString(R.string.copy_succ))
15,選擇年月日
val datePickerDialog = DatePickerDialog(this, DatePickerDialog.OnDateSetListener { view, year, month, day ->
txt_birth.text = year.toString() + "-" + (month + 1) + "-" + day
}, 2000, 1, 1)
datePickerDialog.show()
16,密碼包含字母和數字
//
fun passwordReg(postCode: String): Boolean {
val reg = "^(?=.*?[A-Za-z])(?=.*?[0-9]).{6,18}\$"
return Pattern.matches(reg, postCode)
}
17,retrofit2全局判斷傳回資料,可以處理登陸成功後過一段時間登陸過期。
18,中文轉換為拼音
import android.util.Log;
import net.sourceforge.pinyin4j.PinyinHelper;
import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType;
import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
import net.sourceforge.pinyin4j.format.HanyuPinyinToneType;
import net.sourceforge.pinyin4j.format.HanyuPinyinVCharType;
import java.util.Comparator;
public class PinyinComparator implements Comparator<Object> {
/**
* 比較兩個字元串
*/
public int compare(Object o1, Object o2) {
String[] name1 = (String[]) o1;
String[] name2 = (String[]) o2;
String str1 = getPingYin(name1[0]);
String str2 = getPingYin(name2[0]);
int flag = str1.compareTo(str2);
return flag;
}
/**
* 将字元串中的中文轉化為拼音,其他字元不變
*
* @param inputString
* @return
*/
public String getPingYin(String inputString) {
HanyuPinyinOutputFormat format = new HanyuPinyinOutputFormat();
format.setCaseType(HanyuPinyinCaseType.LOWERCASE);
format.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
format.setVCharType(HanyuPinyinVCharType.WITH_V);
char[] input = inputString.trim().toCharArray();// 把字元串轉化成字元數組
String output = "";
try {
for (int i = 0; i < input.length; i++) {
// \\u4E00是unicode編碼,判斷是不是中文
if (java.lang.Character.toString(input[i]).matches(
"[\\u4E00-\\u9FA5]+")) {
// 将漢語拼音的全拼存到temp數組
String[] temp = PinyinHelper.toHanyuPinyinStringArray(
input[i], format);
// 取拼音的第一個讀音
output += temp[0];
}
// 大寫字母轉化成小寫字母
else if (input[i] > 'A' && input[i] < 'Z') {
output += java.lang.Character.toString(input[i]);
output = output.toLowerCase();
}
output += java.lang.Character.toString(input[i]);
}
} catch (Exception e) {
Log.e("Exception", e.toString());
}
return output;
}
}