feat(layout): 适配平板设备

- 新增横屏布局文件,优化用户体验
- 重构部分代码以支持新布局
-移除不必要的工具类和适配器
This commit is contained in:
muqing 2025-01-17 14:09:39 +08:00
parent c3ac73c8f4
commit e77d3a390d
12 changed files with 178 additions and 186 deletions

View File

@ -9,8 +9,6 @@ Support Chinese and English code association, automatic completion.
![](screenshots/editor.png)
#### 源码运行问题解决:
###### 1.打包时报错缺少SDK路径
@ -24,3 +22,6 @@ SDK location not found.
```
sdk.dir=(安卓SDK路径)
```
#### DeBug
偷偷的更新一下,适配一下平板吧

View File

@ -287,7 +287,8 @@
android:icon="@drawable/table"
android:taskAffinity="@string/code_table"
android:documentLaunchMode="intoExisting"
android:exported="false">
android:exported="false"
tools:ignore="ManifestResource">
</activity>
<activity
android:name=".LoginActivity"

View File

@ -1,33 +1,24 @@
package com.coldmint.rust.pro
import com.coldmint.rust.pro.base.BaseActivity
import android.content.Intent
import cat.ereza.customactivityoncrash.CustomActivityOnCrash
import com.coldmint.rust.pro.tool.AppSettings
import android.annotation.SuppressLint
import android.content.pm.PackageManager
import android.os.Bundle
import android.util.Log
import android.view.KeyEvent
import android.view.LayoutInflater
import android.view.MenuItem
import android.view.View
import androidx.core.view.isVisible
import cat.ereza.customactivityoncrash.CustomActivityOnCrash
import com.coldmint.rust.core.dataBean.ApiResponse
import com.coldmint.rust.core.debug.LogCat
import com.coldmint.rust.core.interfaces.ApiCallBack
import com.coldmint.rust.core.tool.FileOperator
import com.coldmint.rust.core.web.ErrorReport
import com.coldmint.rust.core.web.ServerConfiguration
import com.coldmint.rust.pro.base.BaseActivity
import com.coldmint.rust.pro.databean.ErrorInfo
import com.coldmint.rust.pro.databinding.ActivityErrorBinding
import com.coldmint.rust.pro.tool.AppSettings
import com.coldmint.rust.pro.tool.GlobalMethod
import com.google.android.material.snackbar.Snackbar
import com.google.gson.Gson
import java.io.File
import java.lang.StringBuilder
import java.text.SimpleDateFormat
import java.util.*
class ErrorActivity() : BaseActivity<ActivityErrorBinding>() {
private val errorInfo by lazy {
@ -113,7 +104,7 @@ class ErrorActivity() : BaseActivity<ActivityErrorBinding>() {
}
private fun initAction() {
viewBinding.shareLogButton.setOnClickListener(View.OnClickListener {
viewBinding.shareLogButton.setOnClickListener {
saveLog()
if (!errorInfo.getLogFile().exists()) {
Snackbar.make(
@ -125,7 +116,7 @@ class ErrorActivity() : BaseActivity<ActivityErrorBinding>() {
} else {
FileOperator.shareFile(this@ErrorActivity, errorInfo.getLogFile())
}
})
}

View File

@ -79,7 +79,7 @@ class RustApplication : Application() {
}
// android:screenOrientation="portrait"
//全局强制横屏
activity.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
// activity.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
}
override fun onActivityStarted(activity: Activity) {}
override fun onActivityResumed(activity: Activity) {}

View File

@ -9,18 +9,18 @@ import com.coldmint.rust.core.database.code.CodeInfo
import com.coldmint.rust.core.database.code.SectionInfo
import com.coldmint.rust.core.tool.LineParser
import com.coldmint.rust.pro.R
import com.coldmint.rust.pro.base.BaseVh
import com.coldmint.rust.pro.databinding.ActivityCodeTableBinding
import com.coldmint.rust.pro.databinding.ItemCodetableBinding
import com.coldmint.rust.pro.tool.GlobalMethod
import com.google.android.gms.common.internal.Objects
import com.muqing.VH
class CodeTableAdapter(
val context: Context,
private val group: List<SectionInfo>,
private val itemList: List<List<CodeInfo>>,
private val binding: ActivityCodeTableBinding
) : RecyclerView.Adapter<VH<ItemCodetableBinding>>() {
) : RecyclerView.Adapter<BaseVh<ItemCodetableBinding>>() {
private var versionMap: HashMap<Int, String>? = null
private var typeNameMap: HashMap<String, String>? = null
private var sectionMap: HashMap<String, String>? = null
@ -182,8 +182,8 @@ class CodeTableAdapter(
return resultView.root
}*/
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): VH<ItemCodetableBinding> {
return VH(ItemCodetableBinding.inflate(LayoutInflater.from(parent.context), parent, false))
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BaseVh<ItemCodetableBinding> {
return BaseVh(ItemCodetableBinding.inflate(LayoutInflater.from(parent.context), parent, false))
}
override fun getItemCount(): Int {
@ -204,7 +204,7 @@ class CodeTableAdapter(
}
@SuppressLint("NotifyDataSetChanged", "StringFormatInvalid")
override fun onBindViewHolder(holder: VH<ItemCodetableBinding>, position: Int) {
override fun onBindViewHolder(holder: BaseVh<ItemCodetableBinding>, position: Int) {
holder.binging.title.text = group[position].translate
val format = String.format(
context.getString(R.string.filenum),

View File

@ -20,16 +20,16 @@ import com.coldmint.rust.core.database.code.CodeDataBase
import com.coldmint.rust.core.database.code.CodeInfo
import com.coldmint.rust.core.tool.LineParser
import com.coldmint.rust.pro.R
import com.coldmint.rust.pro.base.BaseVh
import com.coldmint.rust.pro.databinding.CodeTableItemBinding
import com.coldmint.rust.pro.dialog.MaterialBottomDialog
import com.coldmint.rust.pro.tool.AppSettings
import com.coldmint.rust.pro.tool.GlobalMethod
import com.google.android.material.chip.Chip
import com.muqing.VH
import java.util.concurrent.Executors
class CodeTableItemAdapter(val recyclerView: RecyclerView,
var list: List<CodeInfo>) : RecyclerView.Adapter<VH<CodeTableItemBinding>>() {
var list: List<CodeInfo>) : RecyclerView.Adapter<BaseVh<CodeTableItemBinding>>() {
private val lineParser = LineParser()
@ -63,8 +63,8 @@ class CodeTableItemAdapter(val recyclerView: RecyclerView,
notifyDataSetChanged()
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): VH<CodeTableItemBinding> {
return VH(CodeTableItemBinding.inflate(LayoutInflater.from(parent.context), parent, false))
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BaseVh<CodeTableItemBinding> {
return BaseVh(CodeTableItemBinding.inflate(LayoutInflater.from(parent.context), parent, false))
}
override fun getItemCount(): Int {
@ -112,7 +112,7 @@ class CodeTableItemAdapter(val recyclerView: RecyclerView,
}
@SuppressLint("StringFormatInvalid")
override fun onBindViewHolder(holder: VH<CodeTableItemBinding>, position: Int) {
override fun onBindViewHolder(holder: BaseVh<CodeTableItemBinding>, position: Int) {
val context = holder.itemView.context
val resultView: CodeTableItemBinding = holder.binging
val codeInfo = list[position]

View File

@ -8,20 +8,19 @@ import androidx.core.content.ContextCompat
import androidx.recyclerview.widget.RecyclerView
import com.coldmint.rust.core.turret.TurretData
import com.coldmint.rust.pro.R
import com.coldmint.rust.pro.base.BaseVh
import com.coldmint.rust.pro.databinding.ItemTabBinding
import com.muqing.VH
import com.muqing.gj
/**
* @author Cold Mint
* @date 2022/1/10 8:49
*/
class DesignAdapter(private val onclick: Click) : RecyclerView.Adapter<VH<ItemTabBinding>>() {
class DesignAdapter(private val onclick: Click) : RecyclerView.Adapter<BaseVh<ItemTabBinding>>() {
var list: ArrayList<TurretData> = arrayListOf()
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): VH<ItemTabBinding> {
return VH(ItemTabBinding.inflate(LayoutInflater.from(parent.context), parent, false))
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BaseVh<ItemTabBinding> {
return BaseVh(ItemTabBinding.inflate(LayoutInflater.from(parent.context), parent, false))
}
override fun getItemCount(): Int {
@ -31,9 +30,9 @@ class DesignAdapter(private val onclick: Click) : RecyclerView.Adapter<VH<ItemTa
lateinit var string: TurretData
@SuppressLint("NotifyDataSetChanged")
override fun onBindViewHolder(holder: VH<ItemTabBinding>, position: Int) {
override fun onBindViewHolder(holder: BaseVh<ItemTabBinding>, position: Int) {
holder.binging.button.text = list[position].name
gj.sc(list[position].imageFile)
// gj.sc(list[position].imageFile)
if (string == list[position]) {
holder.binging.root.isEnabled = false

View File

@ -1,11 +1,13 @@
package com.muqing;
package com.coldmint.rust.pro.base;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import androidx.viewbinding.ViewBinding;
public class VH<Binging extends ViewBinding> extends RecyclerView.ViewHolder {
public class BaseVh<Binging extends ViewBinding> extends RecyclerView.ViewHolder {
public Binging binging;
public VH(@NonNull Binging itemView) {
public BaseVh(@NonNull Binging itemView) {
super(itemView.getRoot());
this.binging = itemView;
}

View File

@ -2,14 +2,19 @@ package com.coldmint.rust.pro.fragments
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import androidx.viewpager2.widget.ViewPager2
import com.coldmint.rust.pro.R
import com.coldmint.rust.pro.adapters.CommunityAdapter
import com.coldmint.rust.pro.base.BaseFragment
import com.coldmint.rust.pro.databinding.FragmentCommunityBinding
import com.google.android.material.tabs.TabLayoutMediator
import com.google.android.material.navigation.NavigationBarView
class CommunityFragment : BaseFragment<FragmentCommunityBinding>() {
class CommunityFragment : Fragment() {
/**
* 加载tab
*/
private fun loadTab() {
if (!isAdded) {
return
@ -19,51 +24,98 @@ class CommunityFragment : BaseFragment<FragmentCommunityBinding>() {
}*/
}
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
val inflate = inflater.inflate(R.layout.fragment_community, container, false)
onViewCreated(inflate)
return inflate
override fun getViewBindingObject(layoutInflater: LayoutInflater): FragmentCommunityBinding {
return FragmentCommunityBinding.inflate(layoutInflater)
}
override fun whenViewCreated(inflater: LayoutInflater, savedInstanceState: Bundle?) {
viewBinding.pager.adapter = CommunityAdapter(this)
viewBinding.pager.isSaveEnabled = false
viewBinding.pager.registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() {
private fun onViewCreated(view: View) {
val navigationBarView : NavigationBarView = view.findViewById(R.id.bottomnavigationView)
val pager : ViewPager2 = view.findViewById(R.id.pager)
pager.adapter = CommunityAdapter(this)
pager.isSaveEnabled = false
pager.registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() {
override fun onPageSelected(position: Int) {
when (position) {
0 -> {
viewBinding.bottomnavigationView.selectedItemId = R.id.action_recommended
navigationBarView.selectedItemId = R.id.action_recommended
}
1 -> {
viewBinding.bottomnavigationView.selectedItemId = R.id.action_follow
navigationBarView.selectedItemId = R.id.action_follow
}
2 -> {
viewBinding.bottomnavigationView.selectedItemId = R.id.action_ranking
navigationBarView.selectedItemId = R.id.action_ranking
}
3 -> {
viewBinding.bottomnavigationView.selectedItemId = R.id.action_my
navigationBarView.selectedItemId = R.id.action_my
}
}
}
})
viewBinding.bottomnavigationView.setOnItemSelectedListener {
navigationBarView.setOnItemSelectedListener {
when (it.itemId) {
R.id.action_recommended -> {
viewBinding.pager.currentItem = 0
pager.currentItem = 0
}
R.id.action_follow -> {
viewBinding.pager.currentItem = 1
pager.currentItem = 1
}
R.id.action_ranking -> {
viewBinding.pager.currentItem = 2
pager.currentItem = 2
}
R.id.action_my -> {
viewBinding.pager.currentItem = 3
pager.currentItem = 3
}
}
true
}
loadTab()
}
// override fun whenViewCreated(inflater: LayoutInflater, savedInstanceState: Bundle?) {
// viewBinding.pager.adapter = CommunityAdapter(this)
// viewBinding.pager.isSaveEnabled = false
// viewBinding.pager.registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() {
// override fun onPageSelected(position: Int) {
// when (position) {
// 0 -> {
// viewBinding.bottomnavigationView.selectedItemId = R.id.action_recommended
// }
// 1 -> {
// viewBinding.bottomnavigationView.selectedItemId = R.id.action_follow
// }
// 2 -> {
// viewBinding.bottomnavigationView.selectedItemId = R.id.action_ranking
// }
// 3 -> {
// viewBinding.bottomnavigationView.selectedItemId = R.id.action_my
// }
// }
// }
// })
// viewBinding.bottomnavigationView.setOnItemSelectedListener {
// when (it.itemId) {
// R.id.action_recommended -> {
// viewBinding.pager.currentItem = 0
// }
// R.id.action_follow -> {
// viewBinding.pager.currentItem = 1
// }
// R.id.action_ranking -> {
// viewBinding.pager.currentItem = 2
// }
// R.id.action_my -> {
// viewBinding.pager.currentItem = 3
// }
// }
// true
// }
//
//
// loadTab()
// }
}

View File

@ -1,122 +0,0 @@
package com.muqing;
import android.annotation.SuppressLint;
import android.content.ClipData;
import android.content.ClipboardManager;
import android.content.Context;
import android.content.Intent;
import android.content.res.TypedArray;
import android.util.Log;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.util.Collections;
/** @noinspection unused*/
public class gj {
public final static String log_TAB = "输出";
public static void ts(Context a, Object b) {
Toast.makeText(a, b.toString(), Toast.LENGTH_SHORT).show();
}
public static class ts implements Runnable {
String string;
Context context;
public ts(Context context,String string) {
this.string = string;
this.context = context;
}
@Override
public void run() {
ts(context,string);
}
}
public static void sc(Object a) {
if (a == null) {
a = "null";
}
Log.d(log_TAB, a.toString());
}
public static void fx(Context context, String str) {
Intent shareIntent = new Intent(Intent.ACTION_SEND);
shareIntent.setType("text/plain");
shareIntent.putExtra(Intent.EXTRA_TEXT, str);
context.startActivity(shareIntent);
}
/**
* 复制文字到剪切板
*
*/
public static void fz(Context context, String text) {
ClipboardManager systemService =
(ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE);
// 创建能够存入剪贴板的ClipData对象
//Label这是任意文字标签
ClipData mClipData = ClipData.newPlainText("Label", text);
//将ClipData数据复制到剪贴板
systemService.setPrimaryClip(mClipData);
gj.ts(context, "复制成功");
}
public static boolean isWiFiConnected() {
try {
for (NetworkInterface networkInterface : Collections.list(NetworkInterface.getNetworkInterfaces())) {
if (networkInterface.isUp() && !networkInterface.isLoopback()) {
if (networkInterface.getDisplayName().contains("wlan")) {
return true; // Wi-Fi网络
} else if (networkInterface.getDisplayName().contains("rmnet")) {
return false; // 流量网络
}
}
}
} catch (SocketException e) {
sc(e);
}
return false; // 默认为流量网络
}
public static void tcjp(EditText editText) {
editText.requestFocus();//获取焦点
InputMethodManager imm = (InputMethodManager)
editText.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
// gj.sc(imm.isActive());
//没有显示键盘弹出
imm.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT);
}
public static void ycjp(EditText editText) {
InputMethodManager imm = (InputMethodManager)
editText.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
if (imm.isActive()) //有显示键盘隐藏
imm.hideSoftInputFromWindow(editText.getWindowToken(),
InputMethodManager.HIDE_NOT_ALWAYS);
}
public static int getztl(Context context) {
// 获得状态栏高度
@SuppressLint({"InternalInsetResource", "DiscouragedApi"}) int resourceId =
context.getResources().
getIdentifier("status_bar_height", "dimen", "android");
return context.getResources().getDimensionPixelSize(resourceId);
}
public static int getbackgroundColor(AppCompatActivity appCompatActivity) {
TypedArray array = appCompatActivity.getTheme().obtainStyledAttributes(new int[] {
android.R.attr.colorBackground
// android.R.attr.textColorPrimary,
});
int backgroundColor = array.getColor(0, 0xFF00FF);
// int textColor = array.getColor(1, 0xFF00FF);
array.recycle();
return backgroundColor;
}
}

View File

@ -0,0 +1,43 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.drawerlayout.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/drawerlayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="false">
<androidx.coordinatorlayout.widget.CoordinatorLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.google.android.material.appbar.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:fitsSystemWindows="true">
<com.google.android.material.appbar.MaterialToolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize" />
</com.google.android.material.appbar.AppBarLayout>
<fragment
android:id="@+id/baseFragment"
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:defaultNavHost="true"
app:layout_behavior="com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior" />
</androidx.coordinatorlayout.widget.CoordinatorLayout>
<com.google.android.material.navigation.NavigationView
android:id="@+id/navaiagtion"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
app:elevation="2dp"
app:menu="@menu/menu_drawer_left"
tools:ignore="VisualLintBounds" />
</androidx.drawerlayout.widget.DrawerLayout>

View File

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<com.google.android.material.navigationrail.NavigationRailView
android:id="@+id/bottomnavigationView"
android:layout_width="wrap_content"
android:layout_height="match_parent"
app:menu="@menu/menu_main_bottom" />
<androidx.viewpager2.widget.ViewPager2
android:id="@+id/pager"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1" />
<!-- <com.google.android.material.bottomnavigation.BottomNavigationView-->
<!-- android:id="@+id/bottomnavigationView"-->
<!-- android:layout_width="match_parent"-->
<!-- android:layout_height="wrap_content"-->
<!-- app:menu="@menu/menu_main_bottom" />-->
</LinearLayout>