6 changed files with 650 additions and 1 deletions
-
6app/src/main/AndroidManifest.xml
-
373app/src/main/java/com/ouxuan/oxface/DebugActivity.java
-
50app/src/main/java/com/ouxuan/oxface/MainActivity.java
-
8app/src/main/res/drawable/log_background.xml
-
212app/src/main/res/layout/activity_debug.xml
-
2settings.gradle
@ -0,0 +1,373 @@ |
|||||
|
package com.ouxuan.oxface; |
||||
|
|
||||
|
import android.app.Activity; |
||||
|
import android.content.ClipData; |
||||
|
import android.content.ClipboardManager; |
||||
|
import android.content.Context; |
||||
|
import android.content.Intent; |
||||
|
import android.os.Bundle; |
||||
|
import android.os.Handler; |
||||
|
import android.os.Looper; |
||||
|
import android.util.Log; |
||||
|
import android.view.View; |
||||
|
import android.widget.Button; |
||||
|
import android.widget.ScrollView; |
||||
|
import android.widget.TextView; |
||||
|
import android.widget.Toast; |
||||
|
|
||||
|
import com.ouxuan.oxface.device.DeviceUtils; |
||||
|
import com.ouxuan.oxface.network.utils.NetworkUtils; |
||||
|
import com.ouxuan.oxface.utils.AutoStartManager; |
||||
|
import com.ouxuan.oxface.utils.BootSimulationHelper; |
||||
|
import com.ouxuan.oxface.utils.LogManager; |
||||
|
import com.ouxuan.oxface.utils.UtilCodeHelper; |
||||
|
|
||||
|
import java.io.File; |
||||
|
import java.util.Date; |
||||
|
|
||||
|
public class DebugActivity extends Activity { |
||||
|
private static final String TAG = "DebugActivity"; |
||||
|
|
||||
|
private TextView tvLogOutput; |
||||
|
private ScrollView logScrollView; |
||||
|
private AutoStartManager autoStartManager; |
||||
|
|
||||
|
@Override |
||||
|
protected void onCreate(Bundle savedInstanceState) { |
||||
|
super.onCreate(savedInstanceState); |
||||
|
setContentView(R.layout.activity_debug); |
||||
|
|
||||
|
initViews(); |
||||
|
initManagers(); |
||||
|
setupClickListeners(); |
||||
|
} |
||||
|
|
||||
|
private void initViews() { |
||||
|
tvLogOutput = findViewById(R.id.tvLogOutput); |
||||
|
logScrollView = findViewById(R.id.logScrollView); |
||||
|
|
||||
|
// 初始化日志显示 |
||||
|
tvLogOutput.setText("调试界面已启动 - " + new Date().toString() + "\n"); |
||||
|
} |
||||
|
|
||||
|
private void initManagers() { |
||||
|
autoStartManager = AutoStartManager.getInstance(this); |
||||
|
} |
||||
|
|
||||
|
private void setupClickListeners() { |
||||
|
// 测试自启动按钮 |
||||
|
Button btnTestAutoStart = findViewById(R.id.btnTestAutoStart); |
||||
|
btnTestAutoStart.setOnClickListener(new View.OnClickListener() { |
||||
|
@Override |
||||
|
public void onClick(View v) { |
||||
|
logMessage("触发自启动测试..."); |
||||
|
triggerAutoStartTest(); |
||||
|
} |
||||
|
}); |
||||
|
|
||||
|
// 测试直接启动按钮 |
||||
|
Button btnTestDirectStart = findViewById(R.id.btnTestDirectStart); |
||||
|
btnTestDirectStart.setOnClickListener(new View.OnClickListener() { |
||||
|
@Override |
||||
|
public void onClick(View v) { |
||||
|
logMessage("触发直接启动测试..."); |
||||
|
triggerDirectStartTest(); |
||||
|
} |
||||
|
}); |
||||
|
|
||||
|
// 显示日志路径按钮 |
||||
|
Button btnShowLogPath = findViewById(R.id.btnShowLogPath); |
||||
|
btnShowLogPath.setOnClickListener(new View.OnClickListener() { |
||||
|
@Override |
||||
|
public void onClick(View v) { |
||||
|
showLogPathInfo(); |
||||
|
} |
||||
|
}); |
||||
|
|
||||
|
// 写入测试日志按钮 |
||||
|
Button btnWriteTestLog = findViewById(R.id.btnWriteTestLog); |
||||
|
btnWriteTestLog.setOnClickListener(new View.OnClickListener() { |
||||
|
@Override |
||||
|
public void onClick(View v) { |
||||
|
writeTestLogs(); |
||||
|
} |
||||
|
}); |
||||
|
|
||||
|
// 显示自启动状态按钮 |
||||
|
Button btnShowAutoStartStatus = findViewById(R.id.btnShowAutoStartStatus); |
||||
|
btnShowAutoStartStatus.setOnClickListener(new View.OnClickListener() { |
||||
|
@Override |
||||
|
public void onClick(View v) { |
||||
|
showAutoStartStatus(); |
||||
|
} |
||||
|
}); |
||||
|
|
||||
|
// 重置统计信息按钮 |
||||
|
Button btnResetAutoStartStats = findViewById(R.id.btnResetAutoStartStats); |
||||
|
btnResetAutoStartStats.setOnClickListener(new View.OnClickListener() { |
||||
|
@Override |
||||
|
public void onClick(View v) { |
||||
|
resetAutoStartStats(); |
||||
|
} |
||||
|
}); |
||||
|
|
||||
|
// 显示设备信息按钮 |
||||
|
Button btnShowDeviceInfo = findViewById(R.id.btnShowDeviceInfo); |
||||
|
btnShowDeviceInfo.setOnClickListener(new View.OnClickListener() { |
||||
|
@Override |
||||
|
public void onClick(View v) { |
||||
|
showDeviceInfo(); |
||||
|
} |
||||
|
}); |
||||
|
|
||||
|
// 测试网络连接按钮 |
||||
|
Button btnTestNetwork = findViewById(R.id.btnTestNetwork); |
||||
|
btnTestNetwork.setOnClickListener(new View.OnClickListener() { |
||||
|
@Override |
||||
|
public void onClick(View v) { |
||||
|
testNetworkConnection(); |
||||
|
} |
||||
|
}); |
||||
|
|
||||
|
// 清空日志按钮 |
||||
|
Button btnClearLogs = findViewById(R.id.btnClearLogs); |
||||
|
btnClearLogs.setOnClickListener(new View.OnClickListener() { |
||||
|
@Override |
||||
|
public void onClick(View v) { |
||||
|
clearLogs(); |
||||
|
} |
||||
|
}); |
||||
|
|
||||
|
// 测试Shell命令按钮 |
||||
|
Button btnTestShellCommand = findViewById(R.id.btnTestShellCommand); |
||||
|
btnTestShellCommand.setOnClickListener(new View.OnClickListener() { |
||||
|
@Override |
||||
|
public void onClick(View v) { |
||||
|
testShellCommand(); |
||||
|
} |
||||
|
}); |
||||
|
|
||||
|
// 测试闹钟按钮 |
||||
|
Button btnTestAlarm = findViewById(R.id.btnTestAlarm); |
||||
|
btnTestAlarm.setOnClickListener(new View.OnClickListener() { |
||||
|
@Override |
||||
|
public void onClick(View v) { |
||||
|
testAlarm(); |
||||
|
} |
||||
|
}); |
||||
|
|
||||
|
// 关闭按钮 |
||||
|
Button btnClose = findViewById(R.id.btnClose); |
||||
|
btnClose.setOnClickListener(new View.OnClickListener() { |
||||
|
@Override |
||||
|
public void onClick(View v) { |
||||
|
finish(); |
||||
|
} |
||||
|
}); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 触发自启动测试 |
||||
|
*/ |
||||
|
private void triggerAutoStartTest() { |
||||
|
try { |
||||
|
BootSimulationHelper.simulateBootCompleted(this); |
||||
|
logMessage("自启动测试已触发"); |
||||
|
showToast("自启动测试已触发"); |
||||
|
} catch (Exception e) { |
||||
|
Log.e(TAG, "触发自启动测试失败", e); |
||||
|
logMessage("触发自启动测试失败: " + e.getMessage()); |
||||
|
showToast("触发自启动测试失败"); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 直接启动应用测试 |
||||
|
*/ |
||||
|
private void triggerDirectStartTest() { |
||||
|
try { |
||||
|
BootSimulationHelper.directStartApp(this); |
||||
|
logMessage("直接启动测试已触发"); |
||||
|
showToast("直接启动测试已触发"); |
||||
|
} catch (Exception e) { |
||||
|
Log.e(TAG, "触发直接启动测试失败", e); |
||||
|
logMessage("触发直接启动测试失败: " + e.getMessage()); |
||||
|
showToast("触发直接启动测试失败"); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 显示日志路径信息 |
||||
|
*/ |
||||
|
private void showLogPathInfo() { |
||||
|
String pathInfo = LogManager.getLogPathInfo(this); |
||||
|
logMessage("日志路径信息:\n" + pathInfo); |
||||
|
|
||||
|
// 写入一条测试日志 |
||||
|
LogManager.logOperation("调试", "用户查看日志路径信息"); |
||||
|
|
||||
|
// 复制日志目录路径到剪贴板 |
||||
|
ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE); |
||||
|
if (clipboard != null) { |
||||
|
LogManager logManager = LogManager.getInstance(this); |
||||
|
String logDirPath = logManager.getLogDirectory().getAbsolutePath(); |
||||
|
ClipData clip = ClipData.newPlainText("日志目录路径", logDirPath); |
||||
|
clipboard.setPrimaryClip(clip); |
||||
|
showToast("日志目录路径已复制: " + logDirPath); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 写入测试日志 |
||||
|
*/ |
||||
|
private void writeTestLogs() { |
||||
|
// 写入一些测试日志 |
||||
|
LogManager.logInfo("DEBUG", "这是一条测试信息日志 - " + new Date()); |
||||
|
LogManager.logWarning("DEBUG", "这是一条测试警告日志 - " + new Date()); |
||||
|
LogManager.logError("DEBUG", "这是一条测试错误日志 - " + new Date()); |
||||
|
LogManager.logOperation("测试操作", "用户触发测试日志写入"); |
||||
|
LogManager.logPerformance("测试性能", 88); |
||||
|
logMessage("测试日志已写入,请稍后再查看路径信息"); |
||||
|
showToast("测试日志已写入"); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 显示自启动状态 |
||||
|
*/ |
||||
|
private void showAutoStartStatus() { |
||||
|
if (autoStartManager != null) { |
||||
|
String statusInfo = autoStartManager.getAutoStartStatusInfo(); |
||||
|
logMessage("自启动状态信息:\n" + statusInfo); |
||||
|
showToast("自启动状态信息已显示"); |
||||
|
} else { |
||||
|
logMessage("自启动管理器未初始化"); |
||||
|
showToast("自启动管理器未初始化"); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 重置统计信息 |
||||
|
*/ |
||||
|
private void resetAutoStartStats() { |
||||
|
if (autoStartManager != null) { |
||||
|
autoStartManager.resetAutoStartStats(); |
||||
|
logMessage("自启动统计信息已重置"); |
||||
|
showToast("自启动统计信息已重置"); |
||||
|
} else { |
||||
|
logMessage("自启动管理器未初始化"); |
||||
|
showToast("自启动管理器未初始化"); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 显示设备信息 |
||||
|
*/ |
||||
|
private void showDeviceInfo() { |
||||
|
String deviceInfo = DeviceUtils.getDeviceInfo(this); |
||||
|
logMessage("设备信息:\n" + deviceInfo); |
||||
|
showToast("设备信息已显示"); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 测试网络连接 |
||||
|
*/ |
||||
|
private void testNetworkConnection() { |
||||
|
logMessage("正在测试网络连接..."); |
||||
|
boolean isConnected = UtilCodeHelper.Network.isConnected(); |
||||
|
logMessage("网络连接状态: " + (isConnected ? "已连接" : "未连接")); |
||||
|
showToast("网络连接测试完成"); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 清空日志 |
||||
|
*/ |
||||
|
private void clearLogs() { |
||||
|
// 删除日志目录中的所有文件 |
||||
|
LogManager logManager = LogManager.getInstance(this); |
||||
|
File logDir = logManager.getLogDirectory(); |
||||
|
if (logDir.exists() && logDir.isDirectory()) { |
||||
|
File[] logFiles = logDir.listFiles(); |
||||
|
if (logFiles != null) { |
||||
|
for (File file : logFiles) { |
||||
|
if (file.isFile()) { |
||||
|
file.delete(); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
logMessage("日志已清空"); |
||||
|
showToast("日志已清空"); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 测试Shell命令 |
||||
|
*/ |
||||
|
private void testShellCommand() { |
||||
|
logMessage("测试Shell命令执行..."); |
||||
|
try { |
||||
|
// 执行简单的Shell命令 |
||||
|
String result = UtilCodeHelper.Device.getModel(); |
||||
|
logMessage("设备型号: " + result); |
||||
|
showToast("设备信息获取完成"); |
||||
|
} catch (Exception e) { |
||||
|
Log.e(TAG, "设备信息获取失败", e); |
||||
|
logMessage("设备信息获取失败: " + e.getMessage()); |
||||
|
showToast("设备信息获取失败"); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 测试闹钟 |
||||
|
*/ |
||||
|
private void testAlarm() { |
||||
|
logMessage("测试闹钟功能..."); |
||||
|
try { |
||||
|
// 设置一个5秒后的闹钟测试 |
||||
|
Intent intent = new Intent(this, MainActivity.class); |
||||
|
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); |
||||
|
intent.putExtra("auto_start", true); |
||||
|
intent.putExtra("boot_reason", "alarm_test"); |
||||
|
intent.putExtra("start_source", "debug_test"); |
||||
|
|
||||
|
// 使用BootSimulationHelper来设置测试闹钟 |
||||
|
BootSimulationHelper.simulateBootCompleted(this); |
||||
|
logMessage("闹钟测试已触发,将在系统启动模拟后执行"); |
||||
|
showToast("闹钟测试已触发"); |
||||
|
} catch (Exception e) { |
||||
|
Log.e(TAG, "闹钟测试失败", e); |
||||
|
logMessage("闹钟测试失败: " + e.getMessage()); |
||||
|
showToast("闹钟测试失败"); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 在日志输出区域添加消息 |
||||
|
* @param message 要添加的消息 |
||||
|
*/ |
||||
|
private void logMessage(String message) { |
||||
|
runOnUiThread(new Runnable() { |
||||
|
@Override |
||||
|
public void run() { |
||||
|
String currentTime = android.text.format.DateFormat.format("HH:mm:ss", new Date()).toString(); |
||||
|
String logEntry = "[" + currentTime + "] " + message + "\n"; |
||||
|
tvLogOutput.append(logEntry); |
||||
|
|
||||
|
// 滚动到底部 |
||||
|
logScrollView.post(new Runnable() { |
||||
|
@Override |
||||
|
public void run() { |
||||
|
logScrollView.fullScroll(View.FOCUS_DOWN); |
||||
|
} |
||||
|
}); |
||||
|
} |
||||
|
}); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 显示Toast消息 |
||||
|
* @param message 要显示的消息 |
||||
|
*/ |
||||
|
private void showToast(String message) { |
||||
|
Toast.makeText(this, message, Toast.LENGTH_SHORT).show(); |
||||
|
} |
||||
|
} |
@ -0,0 +1,8 @@ |
|||||
|
<?xml version="1.0" encoding="utf-8"?> |
||||
|
<shape xmlns:android="http://schemas.android.com/apk/res/android"> |
||||
|
<solid android:color="#F0F0F0" /> |
||||
|
<stroke |
||||
|
android:width="1dp" |
||||
|
android:color="#CCCCCC" /> |
||||
|
<corners android:radius="4dp" /> |
||||
|
</shape> |
@ -0,0 +1,212 @@ |
|||||
|
<?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" |
||||
|
android:background="@color/white"> |
||||
|
|
||||
|
<!-- 标题栏 --> |
||||
|
<TextView |
||||
|
android:layout_width="match_parent" |
||||
|
android:layout_height="wrap_content" |
||||
|
android:text="调试工具" |
||||
|
android:textSize="24sp" |
||||
|
android:textStyle="bold" |
||||
|
android:textColor="@color/black" |
||||
|
android:gravity="center" |
||||
|
android:layout_marginBottom="16dp" /> |
||||
|
|
||||
|
<!-- 按钮区域 - 使用GridLayout实现每行3个按钮 --> |
||||
|
<ScrollView |
||||
|
android:layout_width="match_parent" |
||||
|
android:layout_height="0dp" |
||||
|
android:layout_weight="1"> |
||||
|
|
||||
|
<LinearLayout |
||||
|
android:layout_width="match_parent" |
||||
|
android:layout_height="wrap_content" |
||||
|
android:orientation="vertical"> |
||||
|
|
||||
|
<!-- 第一行按钮 --> |
||||
|
<LinearLayout |
||||
|
android:layout_width="match_parent" |
||||
|
android:layout_height="wrap_content" |
||||
|
android:orientation="horizontal" |
||||
|
android:layout_marginBottom="8dp"> |
||||
|
|
||||
|
<Button |
||||
|
android:id="@+id/btnTestAutoStart" |
||||
|
android:layout_width="0dp" |
||||
|
android:layout_height="wrap_content" |
||||
|
android:layout_weight="1" |
||||
|
android:text="测试自启动" |
||||
|
android:layout_marginEnd="4dp" |
||||
|
android:textSize="12sp" /> |
||||
|
|
||||
|
<Button |
||||
|
android:id="@+id/btnTestDirectStart" |
||||
|
android:layout_width="0dp" |
||||
|
android:layout_height="wrap_content" |
||||
|
android:layout_weight="1" |
||||
|
android:text="测试直接启动" |
||||
|
android:layout_marginStart="4dp" |
||||
|
android:layout_marginEnd="4dp" |
||||
|
android:textSize="12sp" /> |
||||
|
|
||||
|
<Button |
||||
|
android:id="@+id/btnShowLogPath" |
||||
|
android:layout_width="0dp" |
||||
|
android:layout_height="wrap_content" |
||||
|
android:layout_weight="1" |
||||
|
android:text="显示日志路径" |
||||
|
android:layout_marginStart="4dp" |
||||
|
android:textSize="12sp" /> |
||||
|
|
||||
|
</LinearLayout> |
||||
|
|
||||
|
<!-- 第二行按钮 --> |
||||
|
<LinearLayout |
||||
|
android:layout_width="match_parent" |
||||
|
android:layout_height="wrap_content" |
||||
|
android:orientation="horizontal" |
||||
|
android:layout_marginBottom="8dp"> |
||||
|
|
||||
|
<Button |
||||
|
android:id="@+id/btnWriteTestLog" |
||||
|
android:layout_width="0dp" |
||||
|
android:layout_height="wrap_content" |
||||
|
android:layout_weight="1" |
||||
|
android:text="写入测试日志" |
||||
|
android:layout_marginEnd="4dp" |
||||
|
android:textSize="12sp" /> |
||||
|
|
||||
|
<Button |
||||
|
android:id="@+id/btnShowAutoStartStatus" |
||||
|
android:layout_width="0dp" |
||||
|
android:layout_height="wrap_content" |
||||
|
android:layout_weight="1" |
||||
|
android:text="显示自启动状态" |
||||
|
android:layout_marginStart="4dp" |
||||
|
android:layout_marginEnd="4dp" |
||||
|
android:textSize="12sp" /> |
||||
|
|
||||
|
<Button |
||||
|
android:id="@+id/btnResetAutoStartStats" |
||||
|
android:layout_width="0dp" |
||||
|
android:layout_height="wrap_content" |
||||
|
android:layout_weight="1" |
||||
|
android:text="重置统计信息" |
||||
|
android:layout_marginStart="4dp" |
||||
|
android:textSize="12sp" /> |
||||
|
|
||||
|
</LinearLayout> |
||||
|
|
||||
|
<!-- 第三行按钮 --> |
||||
|
<LinearLayout |
||||
|
android:layout_width="match_parent" |
||||
|
android:layout_height="wrap_content" |
||||
|
android:orientation="horizontal" |
||||
|
android:layout_marginBottom="8dp"> |
||||
|
|
||||
|
<Button |
||||
|
android:id="@+id/btnShowDeviceInfo" |
||||
|
android:layout_width="0dp" |
||||
|
android:layout_height="wrap_content" |
||||
|
android:layout_weight="1" |
||||
|
android:text="显示设备信息" |
||||
|
android:layout_marginEnd="4dp" |
||||
|
android:textSize="12sp" /> |
||||
|
|
||||
|
<Button |
||||
|
android:id="@+id/btnTestNetwork" |
||||
|
android:layout_width="0dp" |
||||
|
android:layout_height="wrap_content" |
||||
|
android:layout_weight="1" |
||||
|
android:text="测试网络连接" |
||||
|
android:layout_marginStart="4dp" |
||||
|
android:layout_marginEnd="4dp" |
||||
|
android:textSize="12sp" /> |
||||
|
|
||||
|
<Button |
||||
|
android:id="@+id/btnClearLogs" |
||||
|
android:layout_width="0dp" |
||||
|
android:layout_height="wrap_content" |
||||
|
android:layout_weight="1" |
||||
|
android:text="清空日志" |
||||
|
android:layout_marginStart="4dp" |
||||
|
android:textSize="12sp" /> |
||||
|
|
||||
|
</LinearLayout> |
||||
|
|
||||
|
<!-- 第四行按钮 --> |
||||
|
<LinearLayout |
||||
|
android:layout_width="match_parent" |
||||
|
android:layout_height="wrap_content" |
||||
|
android:orientation="horizontal" |
||||
|
android:layout_marginBottom="8dp"> |
||||
|
|
||||
|
<Button |
||||
|
android:id="@+id/btnTestShellCommand" |
||||
|
android:layout_width="0dp" |
||||
|
android:layout_height="wrap_content" |
||||
|
android:layout_weight="1" |
||||
|
android:text="测试Shell命令" |
||||
|
android:layout_marginEnd="4dp" |
||||
|
android:textSize="12sp" /> |
||||
|
|
||||
|
<Button |
||||
|
android:id="@+id/btnTestAlarm" |
||||
|
android:layout_width="0dp" |
||||
|
android:layout_height="wrap_content" |
||||
|
android:layout_weight="1" |
||||
|
android:text="测试闹钟" |
||||
|
android:layout_marginStart="4dp" |
||||
|
android:layout_marginEnd="4dp" |
||||
|
android:textSize="12sp" /> |
||||
|
|
||||
|
<Button |
||||
|
android:id="@+id/btnClose" |
||||
|
android:layout_width="0dp" |
||||
|
android:layout_height="wrap_content" |
||||
|
android:layout_weight="1" |
||||
|
android:text="关闭" |
||||
|
android:layout_marginStart="4dp" |
||||
|
android:textSize="12sp" /> |
||||
|
|
||||
|
</LinearLayout> |
||||
|
|
||||
|
</LinearLayout> |
||||
|
|
||||
|
</ScrollView> |
||||
|
|
||||
|
<!-- 日志输出区域 --> |
||||
|
<TextView |
||||
|
android:layout_width="match_parent" |
||||
|
android:layout_height="wrap_content" |
||||
|
android:text="日志输出:" |
||||
|
android:textSize="16sp" |
||||
|
android:textStyle="bold" |
||||
|
android:textColor="@color/black" |
||||
|
android:layout_marginTop="16dp" |
||||
|
android:layout_marginBottom="8dp" /> |
||||
|
|
||||
|
<ScrollView |
||||
|
android:id="@+id/logScrollView" |
||||
|
android:layout_width="match_parent" |
||||
|
android:layout_height="200dp" |
||||
|
android:background="@drawable/log_background" |
||||
|
android:padding="8dp"> |
||||
|
|
||||
|
<TextView |
||||
|
android:id="@+id/tvLogOutput" |
||||
|
android:layout_width="match_parent" |
||||
|
android:layout_height="wrap_content" |
||||
|
android:text="日志将在此显示..." |
||||
|
android:textSize="12sp" |
||||
|
android:textColor="@color/black" |
||||
|
android:fontFamily="monospace" /> |
||||
|
|
||||
|
</ScrollView> |
||||
|
|
||||
|
</LinearLayout> |
Write
Preview
Loading…
Cancel
Save
Reference in new issue