20251022_144647_515
This commit is contained in:
@@ -41,6 +41,17 @@ android {
|
|||||||
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
|
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 允许使用系统隐藏API
|
||||||
|
lintOptions {
|
||||||
|
checkReleaseBuilds false
|
||||||
|
abortOnError false
|
||||||
|
}
|
||||||
|
// 针对PowerProfile的依赖配置
|
||||||
|
dependenciesInfo {
|
||||||
|
includeInApk = false
|
||||||
|
includeInBundle = false
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
#Created by .winboll/winboll_app_build.gradle
|
#Created by .winboll/winboll_app_build.gradle
|
||||||
#Sun Sep 28 13:09:02 HKT 2025
|
#Wed Oct 22 06:41:10 GMT 2025
|
||||||
stageCount=14
|
stageCount=14
|
||||||
libraryProject=
|
libraryProject=
|
||||||
baseVersion=15.4
|
baseVersion=15.4
|
||||||
publishVersion=15.4.13
|
publishVersion=15.4.13
|
||||||
buildCount=0
|
buildCount=13
|
||||||
baseBetaVersion=15.4.14
|
baseBetaVersion=15.4.14
|
||||||
|
|||||||
@@ -24,6 +24,14 @@
|
|||||||
<!-- 显示通知 -->
|
<!-- 显示通知 -->
|
||||||
<uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>
|
<uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>
|
||||||
|
|
||||||
|
<!-- PACKAGE_USAGE_STATS -->
|
||||||
|
<uses-permission android:name="android.permission.PACKAGE_USAGE_STATS"/>
|
||||||
|
|
||||||
|
<!-- BATTERY_STATS -->
|
||||||
|
<uses-permission android:name="android.permission.BATTERY_STATS"/>
|
||||||
|
|
||||||
|
<uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>
|
||||||
|
|
||||||
<uses-feature android:name="android.hardware.camera"/>
|
<uses-feature android:name="android.hardware.camera"/>
|
||||||
|
|
||||||
<uses-feature android:name="android.hardware.camera.autofocus"/>
|
<uses-feature android:name="android.hardware.camera.autofocus"/>
|
||||||
@@ -123,6 +131,8 @@
|
|||||||
|
|
||||||
<activity android:name="cc.winboll.studio.powerbell.activities.PixelPickerActivity"/>
|
<activity android:name="cc.winboll.studio.powerbell.activities.PixelPickerActivity"/>
|
||||||
|
|
||||||
|
<activity android:name="cc.winboll.studio.powerbell.activities.BatteryReportActivity"/>
|
||||||
|
|
||||||
</application>
|
</application>
|
||||||
|
|
||||||
</manifest>
|
</manifest>
|
||||||
@@ -17,7 +17,7 @@ import cc.winboll.studio.libappbase.LogUtils;
|
|||||||
import cc.winboll.studio.powerbell.MainActivity;
|
import cc.winboll.studio.powerbell.MainActivity;
|
||||||
import cc.winboll.studio.powerbell.activities.AboutActivity;
|
import cc.winboll.studio.powerbell.activities.AboutActivity;
|
||||||
import cc.winboll.studio.powerbell.activities.BackgroundPictureActivity;
|
import cc.winboll.studio.powerbell.activities.BackgroundPictureActivity;
|
||||||
import cc.winboll.studio.powerbell.activities.BatteryReporterActivity;
|
import cc.winboll.studio.powerbell.activities.BatteryReportActivity;
|
||||||
import cc.winboll.studio.powerbell.activities.ClearRecordActivity;
|
import cc.winboll.studio.powerbell.activities.ClearRecordActivity;
|
||||||
import cc.winboll.studio.powerbell.activities.WinBoLLActivity;
|
import cc.winboll.studio.powerbell.activities.WinBoLLActivity;
|
||||||
import cc.winboll.studio.powerbell.beans.BackgroundPictureBean;
|
import cc.winboll.studio.powerbell.beans.BackgroundPictureBean;
|
||||||
@@ -161,7 +161,7 @@ public class MainActivity extends WinBoLLActivity {
|
|||||||
startActivity(intent);
|
startActivity(intent);
|
||||||
} else if (menuItemId == R.id.action_battery_reporter) {
|
} else if (menuItemId == R.id.action_battery_reporter) {
|
||||||
Intent intent = new Intent();
|
Intent intent = new Intent();
|
||||||
intent.setClass(this, BatteryReporterActivity.class);
|
intent.setClass(this, BatteryReportActivity.class);
|
||||||
startActivity(intent);
|
startActivity(intent);
|
||||||
} else if (menuItemId == R.id.action_clearrecord) {
|
} else if (menuItemId == R.id.action_clearrecord) {
|
||||||
Intent intent = new Intent();
|
Intent intent = new Intent();
|
||||||
|
|||||||
@@ -0,0 +1,283 @@
|
|||||||
|
package cc.winboll.studio.powerbell.activities;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Author ZhanGSKen&豆包大模型<zhangsken@qq.com>
|
||||||
|
* @Date 2025/10/22 13:21
|
||||||
|
* @Describe BatteryReportActivity
|
||||||
|
*/
|
||||||
|
import android.app.Activity;
|
||||||
|
import android.content.BroadcastReceiver;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.content.IntentFilter;
|
||||||
|
import android.content.pm.ApplicationInfo;
|
||||||
|
import android.content.pm.PackageManager;
|
||||||
|
import android.os.Build;
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.provider.Settings;
|
||||||
|
import android.text.Editable;
|
||||||
|
import android.text.TextWatcher;
|
||||||
|
import android.view.LayoutInflater;
|
||||||
|
import android.view.View;
|
||||||
|
import android.view.ViewGroup;
|
||||||
|
import android.widget.EditText;
|
||||||
|
import android.widget.TextView;
|
||||||
|
import android.widget.Toast;
|
||||||
|
import androidx.recyclerview.widget.LinearLayoutManager;
|
||||||
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
|
import cc.winboll.studio.powerbell.R;
|
||||||
|
import java.lang.reflect.Constructor;
|
||||||
|
import java.lang.reflect.Method;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.Comparator;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import cc.winboll.studio.libappbase.LogUtils;
|
||||||
|
|
||||||
|
public class BatteryReportActivity extends Activity {
|
||||||
|
public static final String TAG = "BatteryReportActivity";
|
||||||
|
|
||||||
|
private RecyclerView rvBatteryReport;
|
||||||
|
private BatteryReportAdapter adapter;
|
||||||
|
private List<AppBatteryModel> dataList = new ArrayList<AppBatteryModel>();
|
||||||
|
private List<AppBatteryModel> filteredList = new ArrayList<AppBatteryModel>(); // 搜索过滤后的数据
|
||||||
|
private BroadcastReceiver batteryReceiver;
|
||||||
|
private int batteryCapacity = 5400; // 手动设置电池容量(mAh,可根据设备实际容量调整)
|
||||||
|
private float lastBatteryPercent = 100.0f; // 上次电池百分比
|
||||||
|
private long lastCheckTime = System.currentTimeMillis(); // 上次检查时间
|
||||||
|
private EditText etSearch;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
setContentView(R.layout.activity_batteryreport);
|
||||||
|
|
||||||
|
if (!hasUsageStatsPermission(this)) {
|
||||||
|
Toast.makeText(this, "请进入设置-应用-权限-特殊访问权限-使用情况访问权限,开启本应用的权限", Toast.LENGTH_LONG).show();
|
||||||
|
startActivity(new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
etSearch = (EditText) findViewById(R.id.et_search);
|
||||||
|
rvBatteryReport = (RecyclerView) findViewById(R.id.rv_battery_report);
|
||||||
|
rvBatteryReport.setLayoutManager(new LinearLayoutManager(this));
|
||||||
|
|
||||||
|
loadAllAppList(); // 加载所有应用(包含系统应用)
|
||||||
|
filteredList.addAll(dataList);
|
||||||
|
adapter = new BatteryReportAdapter(this, filteredList);
|
||||||
|
rvBatteryReport.setAdapter(adapter);
|
||||||
|
|
||||||
|
// 搜索功能监听
|
||||||
|
etSearch.addTextChangedListener(new TextWatcher() {
|
||||||
|
@Override
|
||||||
|
public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onTextChanged(CharSequence s, int start, int before, int count) {
|
||||||
|
filterApps(s.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void afterTextChanged(Editable s) {}
|
||||||
|
});
|
||||||
|
|
||||||
|
// 注册电池广播监听
|
||||||
|
batteryReceiver = new BroadcastReceiver() {
|
||||||
|
@Override
|
||||||
|
public void onReceive(Context context, Intent intent) {
|
||||||
|
int level = intent.getIntExtra("level", 100);
|
||||||
|
int scale = intent.getIntExtra("scale", 100);
|
||||||
|
float currentPercent = (float) level / scale * 100;
|
||||||
|
LogUtils.d(TAG, "电池百分比变化:" + lastBatteryPercent + " -> " + currentPercent);
|
||||||
|
|
||||||
|
// 计算电池消耗百分比
|
||||||
|
if (currentPercent < lastBatteryPercent) {
|
||||||
|
float dropPercent = lastBatteryPercent - currentPercent;
|
||||||
|
long duration = System.currentTimeMillis() - lastCheckTime;
|
||||||
|
LogUtils.d(TAG, "电池消耗:" + dropPercent + "%,时长:" + duration + "ms");
|
||||||
|
// 分配耗电到各应用
|
||||||
|
distributeBatteryConsumption(dropPercent, getAppRunTime());
|
||||||
|
}
|
||||||
|
|
||||||
|
lastBatteryPercent = currentPercent;
|
||||||
|
lastCheckTime = System.currentTimeMillis();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
registerReceiver(batteryReceiver, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onDestroy() {
|
||||||
|
super.onDestroy();
|
||||||
|
if (batteryReceiver != null) {
|
||||||
|
unregisterReceiver(batteryReceiver);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 加载所有应用(包含系统应用)
|
||||||
|
private void loadAllAppList() {
|
||||||
|
PackageManager pm = getPackageManager();
|
||||||
|
List<ApplicationInfo> appList = pm.getInstalledApplications(PackageManager.GET_META_DATA);
|
||||||
|
|
||||||
|
for (ApplicationInfo appInfo : appList) {
|
||||||
|
String packageName = appInfo.packageName;
|
||||||
|
String appName = pm.getApplicationLabel(appInfo).toString();
|
||||||
|
dataList.add(new AppBatteryModel(appName, packageName, "0.0"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 搜索过滤应用
|
||||||
|
private void filterApps(String keyword) {
|
||||||
|
filteredList.clear();
|
||||||
|
if (keyword.isEmpty()) {
|
||||||
|
filteredList.addAll(dataList);
|
||||||
|
} else {
|
||||||
|
for (AppBatteryModel model : dataList) {
|
||||||
|
if (model.getAppName().toLowerCase().contains(keyword.toLowerCase())
|
||||||
|
|| model.getPackageName().toLowerCase().contains(keyword.toLowerCase())) {
|
||||||
|
filteredList.add(model);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
adapter.notifyDataSetChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取应用前台运行时长(统计24小时数据)
|
||||||
|
private Map<String, Long> getAppRunTime() {
|
||||||
|
Map<String, Long> runTimeMap = new HashMap<String, Long>();
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
|
||||||
|
try {
|
||||||
|
android.app.usage.UsageStatsManager manager =
|
||||||
|
(android.app.usage.UsageStatsManager) getSystemService(Context.USAGE_STATS_SERVICE);
|
||||||
|
long endTime = System.currentTimeMillis();
|
||||||
|
long startTime = endTime - 24 * 3600 * 1000; // 近24小时
|
||||||
|
// 使用数值4替代INTERVAL_DAY,兼容低版本识别问题
|
||||||
|
List<android.app.usage.UsageStats> statsList = manager.queryUsageStats(
|
||||||
|
4, startTime, endTime);
|
||||||
|
for (android.app.usage.UsageStats stats : statsList) {
|
||||||
|
LogUtils.d(TAG, "应用" + stats.getPackageName() + "运行时长:" + stats.getTotalTimeInForeground());
|
||||||
|
runTimeMap.put(stats.getPackageName(), stats.getTotalTimeInForeground());
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
LogUtils.e(TAG, "获取应用运行时长失败:" + e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return runTimeMap;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 分配电池消耗到各应用,并按消耗从大到小排序
|
||||||
|
private void distributeBatteryConsumption(float totalDropPercent, Map<String, Long> runTimeMap) {
|
||||||
|
long totalRunTime = 0;
|
||||||
|
for (Long time : runTimeMap.values()) {
|
||||||
|
totalRunTime += time;
|
||||||
|
}
|
||||||
|
for (AppBatteryModel model : dataList) {
|
||||||
|
Long appRunTime = runTimeMap.get(model.getPackageName());
|
||||||
|
if (appRunTime == null) appRunTime = 0L;
|
||||||
|
float ratio = totalRunTime > 0 ? (float) appRunTime / totalRunTime : 0;
|
||||||
|
float consumption = batteryCapacity * totalDropPercent / 100 * ratio;
|
||||||
|
model.setConsumption(String.format("%.1f", consumption));
|
||||||
|
}
|
||||||
|
|
||||||
|
// 按电量消耗从大到小排序
|
||||||
|
Collections.sort(dataList, new Comparator<AppBatteryModel>() {
|
||||||
|
@Override
|
||||||
|
public int compare(AppBatteryModel m1, AppBatteryModel m2) {
|
||||||
|
float c1 = Float.parseFloat(m1.getConsumption());
|
||||||
|
float c2 = Float.parseFloat(m2.getConsumption());
|
||||||
|
return Float.compare(c2, c1); // 逆序排列
|
||||||
|
}
|
||||||
|
});
|
||||||
|
filterApps(etSearch.getText().toString()); // 重新应用搜索过滤
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean hasUsageStatsPermission(Context context) {
|
||||||
|
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
android.app.usage.UsageStatsManager manager =
|
||||||
|
(android.app.usage.UsageStatsManager) context.getSystemService(Context.USAGE_STATS_SERVICE);
|
||||||
|
if (manager == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
long endTime = System.currentTimeMillis();
|
||||||
|
long startTime = endTime - 1000 * 60;
|
||||||
|
List<android.app.usage.UsageStats> statsList = manager.queryUsageStats(
|
||||||
|
android.app.usage.UsageStatsManager.INTERVAL_DAILY, startTime, endTime);
|
||||||
|
|
||||||
|
return statsList != null && !statsList.isEmpty();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class AppBatteryModel {
|
||||||
|
private String appName;
|
||||||
|
private String packageName;
|
||||||
|
private String consumption;
|
||||||
|
|
||||||
|
public AppBatteryModel(String appName, String packageName, String consumption) {
|
||||||
|
this.appName = appName;
|
||||||
|
this.packageName = packageName;
|
||||||
|
this.consumption = consumption;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getAppName() {
|
||||||
|
return appName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getPackageName() {
|
||||||
|
return packageName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getConsumption() {
|
||||||
|
return consumption;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setConsumption(String consumption) {
|
||||||
|
this.consumption = consumption;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class BatteryReportAdapter extends RecyclerView.Adapter<BatteryReportAdapter.ViewHolder> {
|
||||||
|
private Context mContext;
|
||||||
|
private List<AppBatteryModel> mDataList;
|
||||||
|
|
||||||
|
public BatteryReportAdapter(Context context, List<AppBatteryModel> dataList) {
|
||||||
|
this.mContext = context;
|
||||||
|
this.mDataList = dataList;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
|
||||||
|
View itemView = LayoutInflater.from(mContext)
|
||||||
|
.inflate(android.R.layout.simple_list_item_2, parent, false);
|
||||||
|
return new ViewHolder(itemView);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onBindViewHolder(ViewHolder holder, int position) {
|
||||||
|
AppBatteryModel model = mDataList.get(position);
|
||||||
|
holder.tvAppName.setText(model.getAppName()); // 显示应用名称
|
||||||
|
holder.tvConsumption.setText("电量消耗:" + model.getConsumption() + " mAh");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getItemCount() {
|
||||||
|
return mDataList.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class ViewHolder extends RecyclerView.ViewHolder {
|
||||||
|
TextView tvAppName;
|
||||||
|
TextView tvConsumption;
|
||||||
|
|
||||||
|
public ViewHolder(View itemView) {
|
||||||
|
super(itemView);
|
||||||
|
tvAppName = (TextView) itemView.findViewById(android.R.id.text1);
|
||||||
|
tvConsumption = (TextView) itemView.findViewById(android.R.id.text2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@@ -1,51 +0,0 @@
|
|||||||
package cc.winboll.studio.powerbell.activities;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @Author ZhanGSKen<zhangsken@qq.com>
|
|
||||||
* @Date 2025/03/22 14:20:15
|
|
||||||
*/
|
|
||||||
import android.app.Activity;
|
|
||||||
import android.os.Bundle;
|
|
||||||
import androidx.recyclerview.widget.DividerItemDecoration;
|
|
||||||
import androidx.recyclerview.widget.LinearLayoutManager;
|
|
||||||
import androidx.recyclerview.widget.RecyclerView;
|
|
||||||
import cc.winboll.studio.powerbell.R;
|
|
||||||
import cc.winboll.studio.powerbell.adapters.BatteryAdapter;
|
|
||||||
import cc.winboll.studio.powerbell.beans.BatteryData;
|
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
public class BatteryReporterActivity extends Activity {
|
|
||||||
public static final String TAG = "BatteryReporterActivity";
|
|
||||||
|
|
||||||
private RecyclerView rvBatteryReport;
|
|
||||||
private BatteryAdapter adapter;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onCreate(Bundle savedInstanceState) {
|
|
||||||
super.onCreate(savedInstanceState);
|
|
||||||
setContentView(R.layout.activity_battery_reporter);
|
|
||||||
|
|
||||||
rvBatteryReport = findViewById(R.id.rvBatteryReport);
|
|
||||||
setupRecyclerView();
|
|
||||||
loadSampleData();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void setupRecyclerView() {
|
|
||||||
adapter = new BatteryAdapter();
|
|
||||||
rvBatteryReport.setLayoutManager(new LinearLayoutManager(this));
|
|
||||||
rvBatteryReport.setAdapter(adapter);
|
|
||||||
rvBatteryReport.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL));
|
|
||||||
}
|
|
||||||
|
|
||||||
private void loadSampleData() {
|
|
||||||
List<BatteryData> dataList = Arrays.asList(
|
|
||||||
new BatteryData(95, "01:23:45", "00:05:12"),
|
|
||||||
new BatteryData(80, "02:15:30", "00:10:00"),
|
|
||||||
new BatteryData(65, "03:45:15", "00:15:30"),
|
|
||||||
new BatteryData(50, "05:00:00", "00:20:45")
|
|
||||||
);
|
|
||||||
adapter.updateData(dataList);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,24 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<LinearLayout
|
|
||||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="match_parent"
|
|
||||||
android:orientation="vertical"
|
|
||||||
android:padding="16dp">
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:text="电池使用报告"
|
|
||||||
android:textSize="24sp"
|
|
||||||
android:fontFamily="sans-serif-medium"
|
|
||||||
android:layout_marginBottom="16dp"/>
|
|
||||||
|
|
||||||
<androidx.recyclerview.widget.RecyclerView
|
|
||||||
android:id="@+id/rvBatteryReport"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="match_parent"
|
|
||||||
android:divider="@drawable/divider_line"
|
|
||||||
android:dividerHeight="1dp"/>
|
|
||||||
|
|
||||||
</LinearLayout>
|
|
||||||
22
powerbell/src/main/res/layout/activity_batteryreport.xml
Normal file
22
powerbell/src/main/res/layout/activity_batteryreport.xml
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
<EditText
|
||||||
|
android:id="@+id/et_search"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:hint="搜索应用名称或包名"
|
||||||
|
android:padding="8dp"
|
||||||
|
android:background="@android:drawable/editbox_background" />
|
||||||
|
|
||||||
|
<androidx.recyclerview.widget.RecyclerView
|
||||||
|
android:id="@+id/rv_battery_report"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:padding="8dp" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
Reference in New Issue
Block a user