fist commit

This commit is contained in:
renjianbo
2026-01-07 11:13:33 +08:00
parent 48fa1e2922
commit 963f37010e
49 changed files with 11948 additions and 11117 deletions

2
.idea/compiler.xml generated
View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CompilerConfiguration">
<bytecodeTargetLevel target="1.8" />
<bytecodeTargetLevel target="21" />
</component>
</project>

10
.idea/deploymentTargetSelector.xml generated Normal file
View File

@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="deploymentTargetSelector">
<selectionStates>
<SelectionState runConfigName="app">
<option name="selectionMode" value="DROPDOWN" />
</SelectionState>
</selectionStates>
</component>
</project>

6
.idea/kotlinc.xml generated Normal file
View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="KotlinJpsPluginSettings">
<option name="version" value="1.9.0" />
</component>
</project>

10
.idea/migrations.xml generated Normal file
View File

@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectMigrations">
<option name="MigrateToGradleLocalJavaHome">
<set>
<option value="$PROJECT_DIR$" />
</set>
</option>
</component>
</project>

2
.idea/misc.xml generated
View File

@@ -44,7 +44,7 @@
<option name="priority" value="Medium" />
<option name="excludeFilter" value="" />
</component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" default="true" project-jdk-name="1.8" project-jdk-type="JavaSDK">
<component name="ProjectRootManager" version="2" languageLevel="JDK_21" default="true" project-jdk-name="jbr-21" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/build/classes" />
</component>
<component name="ProjectType">

6
.idea/modules.xml generated
View File

@@ -4,7 +4,13 @@
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/modules/HouseProperty.iml" filepath="$PROJECT_DIR$/.idea/modules/HouseProperty.iml" />
<module fileurl="file://$PROJECT_DIR$/.idea/modules/app/HouseProperty.app.iml" filepath="$PROJECT_DIR$/.idea/modules/app/HouseProperty.app.iml" />
<module fileurl="file://$PROJECT_DIR$/.idea/modules/app/HouseProperty.app.androidTest.iml" filepath="$PROJECT_DIR$/.idea/modules/app/HouseProperty.app.androidTest.iml" />
<module fileurl="file://$PROJECT_DIR$/.idea/modules/app/HouseProperty.app.main.iml" filepath="$PROJECT_DIR$/.idea/modules/app/HouseProperty.app.main.iml" />
<module fileurl="file://$PROJECT_DIR$/.idea/modules/app/HouseProperty.app.unitTest.iml" filepath="$PROJECT_DIR$/.idea/modules/app/HouseProperty.app.unitTest.iml" />
<module fileurl="file://$PROJECT_DIR$/.idea/modules/ninegridview/HouseProperty.ninegridview.iml" filepath="$PROJECT_DIR$/.idea/modules/ninegridview/HouseProperty.ninegridview.iml" />
<module fileurl="file://$PROJECT_DIR$/.idea/modules/ninegridview/HouseProperty.ninegridview.androidTest.iml" filepath="$PROJECT_DIR$/.idea/modules/ninegridview/HouseProperty.ninegridview.androidTest.iml" />
<module fileurl="file://$PROJECT_DIR$/.idea/modules/ninegridview/HouseProperty.ninegridview.main.iml" filepath="$PROJECT_DIR$/.idea/modules/ninegridview/HouseProperty.ninegridview.main.iml" />
<module fileurl="file://$PROJECT_DIR$/.idea/modules/ninegridview/HouseProperty.ninegridview.unitTest.iml" filepath="$PROJECT_DIR$/.idea/modules/ninegridview/HouseProperty.ninegridview.unitTest.iml" />
</modules>
</component>
</project>

17
.idea/runConfigurations.xml generated Normal file
View File

@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="RunConfigurationProducerService">
<option name="ignoredProducers">
<set>
<option value="com.intellij.execution.junit.AbstractAllInDirectoryConfigurationProducer" />
<option value="com.intellij.execution.junit.AllInPackageConfigurationProducer" />
<option value="com.intellij.execution.junit.PatternConfigurationProducer" />
<option value="com.intellij.execution.junit.TestInClassConfigurationProducer" />
<option value="com.intellij.execution.junit.UniqueIdConfigurationProducer" />
<option value="com.intellij.execution.junit.testDiscovery.JUnitTestDiscoveryConfigurationProducer" />
<option value="org.jetbrains.kotlin.idea.junit.KotlinJUnitRunConfigurationProducer" />
<option value="org.jetbrains.kotlin.idea.junit.KotlinPatternConfigurationProducer" />
</set>
</option>
</component>
</project>

3
.vscode/settings.json vendored Normal file
View File

@@ -0,0 +1,3 @@
{
"java.configuration.updateBuildConfiguration": "interactive"
}

View File

@@ -1,6 +1,8 @@
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
android {
namespace "com.sl.house_property"
packagingOptions {
exclude 'META-INF/DEPENDENCIES'
@@ -21,18 +23,18 @@ android {
lintOptions {
abortOnError false
}
dataBinding {
enabled = true
buildFeatures {
dataBinding = true
}
compileSdkVersion 30
buildToolsVersion '30.0.0'
compileSdkVersion 33
// buildToolsVersion 在 AGP 8.0+ 中不再需要,会自动使用默认版本
aaptOptions.cruncherEnabled = false
aaptOptions.useNewCruncher = false
defaultConfig {
// multiDexEnabled true
javaCompileOptions { annotationProcessorOptions { includeCompileClasspath = true } }
// includeCompileClasspath 在 AGP 3.0+ 中已移除,功能默认启用,无需配置
// multiDexEnabled true
applicationId "com.sl.HouseProperty"
minSdkVersion 21
@@ -79,6 +81,18 @@ android {
}
dependencies {
// 添加 Kotlin 标准库
def kotlin_version = rootProject.ext.kotlin_version
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
// Kotlin 标准库(DataBinding 编译器在 AGP 8.x 中需要)
compileOnly "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
annotationProcessor "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
// 统一 Kotlin 版本,排除冲突的旧版本
configurations.all {
exclude group: 'org.jetbrains.kotlin', module: 'kotlin-stdlib-jdk7'
exclude group: 'org.jetbrains.kotlin', module: 'kotlin-stdlib-jdk8'
}
implementation fileTree(dir: 'libs', include: ['*.jar'])
androidTestImplementation('com.android.support.test.espresso:espresso-core:2.2.2', {
@@ -101,9 +115,10 @@ android {
implementation 'com.trello:rxlifecycle-components:+'
implementation 'com.squareup.picasso:picasso:2.5.2'
//图片加载框架
implementation 'com.android.databinding:library:1.1'
implementation 'com.android.databinding:baseLibrary:1.1'
implementation 'com.android.databinding:adapters:1.1'
// DataBinding 在 AGP 中已内置,不再需要单独依赖
// implementation 'com.android.databinding:library:1.1'
// implementation 'com.android.databinding:baseLibrary:1.1'
// implementation 'com.android.databinding:adapters:1.1'
implementation 'top.zibin:Luban:1.1.8'
implementation 'com.hjq:xxpermissions:5.5'
implementation 'com.jzj.view:ObservableScrollView:0.0.2'
@@ -173,6 +188,10 @@ android {
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = '1.8'
}
}

View File

@@ -61,8 +61,7 @@ public class AboutusActivity extends BaseActivity<ActivityAboutusBinding> {
webSettings.setJavaScriptCanOpenWindowsAutomatically(true); //支持通过JS打开新窗口
webSettings.setLoadsImagesAutomatically(true); //支持自动加载图片
webSettings.setDefaultTextEncodingName("utf-8");//设置编码格式
webSettings.setAppCachePath(getPackageCodePath()+"/myapp");
webSettings.setAppCacheMaxSize(10000);
// setAppCachePath 和 setAppCacheMaxSize 已在 API 33 中移除,使用默认缓存设置
//webview.loadUrl("www.baidu.com");
webview.setWebViewClient(new WebViewClient(){
@Override

View File

@@ -108,9 +108,8 @@ public class AdeviseActivity extends BaseActivity<ActivityAdeviseBinding> {
// setToast(1, resultcode.msg);
return;
}
switch (getcode1) {
case R.id.comimit:
int comimitId = R.id.comimit;
if (getcode1 == comimitId) {
// setToast(0, getString(R.string.loginsucess));
showToast("提交成功");
mDataBinding.getRoot().postDelayed(new Runnable() {
@@ -119,10 +118,6 @@ public class AdeviseActivity extends BaseActivity<ActivityAdeviseBinding> {
finish();
}
},1000);
break;
}
}

View File

@@ -55,9 +55,8 @@ public class ForgetPwdActivity extends BaseActivity<ActivityForgetPwdBinding> im
}
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.getcode:
int id = view.getId();
if (id == R.id.getcode) {
if(mDataBinding.registerphone.getText().toString().length()==0){
setToast(getString(R.string.me_input_phone_tip));
return;
@@ -67,8 +66,7 @@ public class ForgetPwdActivity extends BaseActivity<ActivityForgetPwdBinding> im
return;
}
getMesgCode(R.id.getcode);
break;
case R.id.register:
} else if (id == R.id.register) {
if(mDataBinding.registerphone.getText().toString().length()==0){
setToast(getString(R.string.me_input_phone_tip));
return;
@@ -104,8 +102,6 @@ public class ForgetPwdActivity extends BaseActivity<ActivityForgetPwdBinding> im
return;
}
register(view.getId());
break;
}
}
private void register(int id) {
@@ -163,16 +159,12 @@ public class ForgetPwdActivity extends BaseActivity<ActivityForgetPwdBinding> im
mDataBinding.getcode.setClickable(true);
return;
}
switch (getcode1) {
case R.id.getcode:
if (getcode1 == R.id.getcode) {
// showToast( getString(R.string.megissucess));
startTimer();
break;
case R.id.register:
} else if (getcode1 == R.id.register) {
setToast( getString(R.string.changpawdsucess));
finish();
break;
}
}

View File

@@ -147,16 +147,17 @@ public class LoginActivity extends BaseActivity<ActivityLoginBinding> implements
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.gotoregister:
int gotoregisterId = R.id.gotoregister;
int forgetpawId = R.id.forgetpaw;
int logintextId = R.id.logintext;
if (view.getId() == gotoregisterId) {
Intent intent = new Intent(LoginActivity.this, RegisterActivity.class);
startActivity(intent);
break;
case R.id.forgetpaw:
} else if (view.getId() == forgetpawId) {
Intent intent2 = new Intent(LoginActivity.this, ForgetPwdActivity.class);
startActivity(intent2);
break;
case R.id.logintext:
} else if (view.getId() == logintextId) {
if (!mDataBinding.tvYs.isSelected()) {
setToast("请先阅读并勾选同意用户协议和隐私政策");
return;
@@ -198,7 +199,6 @@ public class LoginActivity extends BaseActivity<ActivityLoginBinding> implements
map.put("app", "Cas");
map.put("class", "Login");
getGankList(ApiConfig.BASE_URL, map, getResources().getString(R.string.logining), view.getId());
break;
}
}
@@ -228,9 +228,8 @@ public class LoginActivity extends BaseActivity<ActivityLoginBinding> implements
setToast(resultcode.msg);
return;
}
switch (getcode1) {
case R.id.logintext:
int logintextId2 = R.id.logintext;
if (getcode1 == logintextId2) {
Gson gs = new Gson();
LinkedTreeMap adta = (LinkedTreeMap) resultcode.data;
String s = gs.toJson(adta);
@@ -251,10 +250,6 @@ public class LoginActivity extends BaseActivity<ActivityLoginBinding> implements
//map.put("home_id", "GetHomeByPid");
map.put("sign", Md5.md5("Cas" + "MyHouseList" + Md5.secret));
getpammar(ApiConfig.BASE_URL, map, getResources().getString(R.string.requsting), 0);
break;
}
}

View File

@@ -181,8 +181,8 @@ public class Main1Fragment extends BaseFragment<FragmentMain1Binding> implements
@Override
public void onClick(View view) {
Intent intent = null;
switch (view.getId()) {
case R.id.fabu:
int id = view.getId();
if (id == R.id.fabu) {
intent = null;
if ((Config.getInstance(Main1Fragment.this.getContext()).getUser() == null)) {
intent = new Intent(Main1Fragment.this.getContext(), LoginActivity.class);
@@ -191,12 +191,10 @@ public class Main1Fragment extends BaseFragment<FragmentMain1Binding> implements
intent = new Intent(Main1Fragment.this.getContext(), MyshopEditAcitivity.class);
startActivityForResult(intent, myeditcode);
}
break;
case R.id.liulan:
} else if (id == R.id.liulan) {
intent = new Intent(getActivity(), MyMarketShopActivity.class);
intent.putExtra("type", 1);
startActivity(intent);
break;
}
}

View File

@@ -122,9 +122,8 @@ public class Main2Fragment extends BaseFragment<FragmentMain2Binding> implements
@Override
public void onClick(View view) {
//1水费,2电费.3燃气费,4物业费,5车位管理费,6家政服务费,7报修支付费用
switch (view.getId()){
case R.id.fei0:
int id = view.getId();
if (id == R.id.fei0) {
if( (Config.getInstance(getContext()).getUser()==null)){
intent =new Intent(getContext(),LoginActivity.class);
startActivity(intent);
@@ -134,10 +133,7 @@ public class Main2Fragment extends BaseFragment<FragmentMain2Binding> implements
intent.putExtra("feeType","1");
startActivity(intent);
}
break;
case R.id.fei1:
} else if (id == R.id.fei1) {
if( (Config.getInstance(getContext()).getUser()==null)){
intent =new Intent(getContext(),LoginActivity.class);
startActivity(intent);
@@ -147,9 +143,7 @@ public class Main2Fragment extends BaseFragment<FragmentMain2Binding> implements
intent.putExtra("feeType","2");
startActivity(intent);
}
break;
case R.id.fei2:
} else if (id == R.id.fei2) {
if( (Config.getInstance(getContext()).getUser()==null)){
intent =new Intent(getContext(),LoginActivity.class);
startActivity(intent);
@@ -159,10 +153,7 @@ public class Main2Fragment extends BaseFragment<FragmentMain2Binding> implements
intent.putExtra("feeType","3");
startActivity(intent);
}
break;
case R.id.fei3:
} else if (id == R.id.fei3) {
if( (Config.getInstance(getContext()).getUser()==null)){
intent =new Intent(getContext(),LoginActivity.class);
startActivity(intent);
@@ -172,8 +163,7 @@ public class Main2Fragment extends BaseFragment<FragmentMain2Binding> implements
intent.putExtra("feeType","4");
startActivity(intent);
}
break;
case R.id.fei4:
} else if (id == R.id.fei4) {
if( (Config.getInstance(getContext()).getUser()==null)){
intent =new Intent(getContext(),LoginActivity.class);
startActivity(intent);
@@ -183,14 +173,11 @@ public class Main2Fragment extends BaseFragment<FragmentMain2Binding> implements
intent.putExtra("feeType","5");
startActivity(intent);
}
break;
case R.id.feilist:
break;
case R.id.helpcenter:
break;
} else if (id == R.id.feilist) {
// 空操作
} else if (id == R.id.helpcenter) {
// 空操作
}
}
/**

View File

@@ -669,17 +669,15 @@ public class MainFragment extends BaseFragment<FragmentMainBinding> implements V
@Override
public void onClick(View view) {
Intent intent = null;
switch (view.getId()) {
case R.id.scan:
int id = view.getId();
if (id == R.id.scan) {
if ((Config.getInstance(MainFragment.this.getContext()).getUser() == null)) {
intent = new Intent(MainFragment.this.getContext(), LoginActivity.class);
} else {
intent = new Intent(getActivity(), QRcodeActivity.class);
}
startActivity(intent);
break;
case R.id.entrancegurd://门禁
} else if (id == R.id.entrancegurd) {//门禁
if( (Config.getInstance(getContext()).getUser()==null)){
intent =new Intent(getContext(),LoginActivity.class);
startActivity(intent);
@@ -701,8 +699,7 @@ public class MainFragment extends BaseFragment<FragmentMainBinding> implements V
intent = new Intent(getActivity(), CodeActivity.class);
}
startActivity(intent);
break;
case R.id.cargara://社区内购
} else if (id == R.id.cargara) {//社区内购
String appId = "wx7e09fff168f6e58d"; // 填移动应用(App)的 AppId,非小程序的 AppID
IWXAPI api = WXAPIFactory.createWXAPI(getActivity(), appId);
WXLaunchMiniProgram.Req req = new WXLaunchMiniProgram.Req();
@@ -710,11 +707,9 @@ public class MainFragment extends BaseFragment<FragmentMainBinding> implements V
req.path = "/pages/index/index"; //拉起小程序页面的可带参路径,不填默认拉起小程序首页,对于小游戏,可以只传入 query 部分,来实现传参效果,如:传入 "?foo=bar"。
req.miniprogramType = WXLaunchMiniProgram.Req.MINIPTOGRAM_TYPE_RELEASE;// 可选打开 开发版,体验版和正式版
api.sendReq(req);
break;
case R.id.moew1:
} else if (id == R.id.moew1) {
intent = new Intent(getActivity(), MyMarketShopActivity.class);
startActivity(intent);
break;
}
}

View File

@@ -195,8 +195,13 @@ public class MainTabActivity extends BaseActivity<ActivityMainTabBinding>
if (currentFragment != null)
fragmentTransaction.hide(currentFragment);
switch (i) {
case R.id.button:
int buttonId = R.id.button;
int button1Id = R.id.button1;
int rl2Id = R.id.rl2;
int button3Id = R.id.button3;
int button4Id = R.id.button4;
if (i == buttonId) {
mDataBinding.button.setChecked(true);
mDataBinding.button1.setChecked(false);
mDataBinding.button2.setChecked(false);
@@ -211,8 +216,7 @@ public class MainTabActivity extends BaseActivity<ActivityMainTabBinding>
currentFragment = fragment0;
//setSytemBar(R.color.transparent);
break;
case R.id.button1:
} else if (i == button1Id) {
mDataBinding.button.setChecked(false);
mDataBinding.button1.setChecked(true);
mDataBinding.button2.setChecked(false);
@@ -229,8 +233,7 @@ public class MainTabActivity extends BaseActivity<ActivityMainTabBinding>
currentFragment = fragment1;
break;
case R.id.rl2:
} else if (i == rl2Id) {
mDataBinding.button.setChecked(false);
mDataBinding.button1.setChecked(false);
mDataBinding.button2.setChecked(true);
@@ -243,8 +246,7 @@ public class MainTabActivity extends BaseActivity<ActivityMainTabBinding>
}
currentFragment = messageFragment;
break;
case R.id.button3:
} else if (i == button3Id) {
// mDataBinding.getRoot().setBackground(getResources().getDrawable(R.drawable.background_slowly));
if (fragment3 == null) {
fragment3 = CartFragment.newInstance();
@@ -254,8 +256,7 @@ public class MainTabActivity extends BaseActivity<ActivityMainTabBinding>
}
currentFragment = fragment3;
break;
case R.id.button4:
} else if (i == button4Id) {
mDataBinding.button.setChecked(false);
mDataBinding.button1.setChecked(false);
mDataBinding.button2.setChecked(false);
@@ -268,7 +269,6 @@ public class MainTabActivity extends BaseActivity<ActivityMainTabBinding>
fragmentTransaction.show(fragment4);
}
currentFragment = fragment4;
break;
}
try {
fragmentTransaction.commit();

View File

@@ -57,19 +57,17 @@ public class MakeErrorActivity extends BaseActivity<ActivityMakeErrorBinding> im
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.textView21:
int id = v.getId();
if (id == R.id.textView21) {
Intent intent = new Intent(MakeErrorActivity.this, LogoActivity.class);
startActivity(intent);
finish();
// getAsyTask(int index,Map<String,Object> map,String url,String titile,int visible,Boolean isPost)
//(final int index,Map<String, Object> params,String url,final Activity act,String msg,int type,Handler mHandler,boolean isPost){
// httpNet.getAsyBackResult(1, map, HttpUrl.giveABUg(), MakeErrorActivity.this, "正在上传服务器,请稍等", HttpNet.PROGRESSVISIBLE, handler, HttpNet.POSTTYPE);
break;
case R.id.textView22:
} else if (id == R.id.textView22) {
MyApplication.getApp().exit();
finish();
break;
}
}

View File

@@ -38,16 +38,11 @@ public class MarkingFinishAwardDialong extends Dialog implements View.OnClickLis
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.close:
int id = v.getId();
if (id == R.id.close) {
MarkingFinishAwardDialong.this.dismiss();
break;
case R.id.btn_oreder_back:
} else if (id == R.id.btn_oreder_back) {
// takeMyPhoto(1000);
break;
default:
break;
}
}
// private void takeMyPhoto(int userImgeREQUST) {

View File

@@ -66,12 +66,8 @@ public class ModifyPswdActivity extends BaseActivity<ActivityModifyPswdBinding>
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.register:
int id = view.getId();
if (id == R.id.register) {
if(mDataBinding.logincode.getText().toString().length()<6){
setToast(getString(R.string.me_input_old_password_tip));
return;
@@ -91,8 +87,6 @@ public class ModifyPswdActivity extends BaseActivity<ActivityModifyPswdBinding>
}
register(view.getId());
break;
}
}
@@ -142,10 +136,7 @@ public class ModifyPswdActivity extends BaseActivity<ActivityModifyPswdBinding>
setToast(resultcode.msg);
return;
}
switch (getcode1) {
case R.id.register:
if (getcode1 == R.id.register) {
setToast("修改密码成功");
mDataBinding.getRoot().postDelayed(new Runnable() {
@Override
@@ -153,9 +144,6 @@ public class ModifyPswdActivity extends BaseActivity<ActivityModifyPswdBinding>
finish();
}
},1500);
break;
}
}

View File

@@ -63,8 +63,7 @@ public class NewsDetailActivity extends BaseActivity<ActivityNewsDetailBinding>
webSettings.setJavaScriptCanOpenWindowsAutomatically(true); //支持通过JS打开新窗口
webSettings.setLoadsImagesAutomatically(true); //支持自动加载图片
webSettings.setDefaultTextEncodingName("utf-8");//设置编码格式
webSettings.setAppCachePath(getPackageCodePath()+"/myapp");
webSettings.setAppCacheMaxSize(10000);
// setAppCachePath 和 setAppCacheMaxSize 已在 API 33 中移除,使用默认缓存设置
//webview.loadUrl("www.baidu.com");
webview.setWebViewClient(new WebViewClient(){
@Override

View File

@@ -74,10 +74,8 @@ public class RegisterActivity extends BaseActivity<ActivityRegisterBinding> impl
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.getcode:
int id = view.getId();
if (id == R.id.getcode) {
if (mDataBinding.registerphone.getText().toString().length() < 1) {
setToast(getString(R.string.me_input_phone_tip));
return;
@@ -87,8 +85,7 @@ public class RegisterActivity extends BaseActivity<ActivityRegisterBinding> impl
return;
}
getMesgCode(R.id.getcode);
break;
case R.id.register:
} else if (id == R.id.register) {
if (mDataBinding.registerphone.getText().toString().length() == 0) {
setToast(getString(R.string.me_input_phone_tip));
return;
@@ -142,8 +139,6 @@ public class RegisterActivity extends BaseActivity<ActivityRegisterBinding> impl
}
register(view.getId());
break;
}
}
@@ -204,13 +199,10 @@ public class RegisterActivity extends BaseActivity<ActivityRegisterBinding> impl
mDataBinding.getcode.setClickable(true);
return;
}
switch (getcode1) {
case R.id.getcode:
if (getcode1 == R.id.getcode) {
setToast(getString(R.string.megissucess));
startTimer();
break;
case R.id.register:
} else if (getcode1 == R.id.register) {
setToast(getString(R.string.registersucess));
Gson gs = new Gson();
LinkedTreeMap adta = (LinkedTreeMap) resultcode.data;
@@ -227,9 +219,6 @@ public class RegisterActivity extends BaseActivity<ActivityRegisterBinding> impl
}
});
new XPopup.Builder(RegisterActivity.this).asCustom(bindHouseDialog).show();
break;
}
}

View File

@@ -63,8 +63,7 @@ public class RegisterAgreementActivity extends BaseActivity<ActivityRegisterAgre
webSettings.setJavaScriptCanOpenWindowsAutomatically(true); //支持通过JS打开新窗口
webSettings.setLoadsImagesAutomatically(true); //支持自动加载图片
webSettings.setDefaultTextEncodingName("utf-8");//设置编码格式
webSettings.setAppCachePath(getPackageCodePath()+"/myapp");
webSettings.setAppCacheMaxSize(10000);
// setAppCachePath 和 setAppCacheMaxSize 已在 API 33 中移除,使用默认缓存设置
//webview.loadUrl("www.baidu.com");
webview.setWebViewClient(new WebViewClient(){
@Override

View File

@@ -88,36 +88,29 @@ public class SettingActivity extends BaseActivity<ActivitySettingBinding> implem
@Override
public void onClick(View view) {
Intent intent = null;
switch (view.getId()) {
case R.id.id0:
int id = view.getId();
if (id == R.id.id0) {
intent = new Intent(SettingActivity.this, ModifyPswdActivity.class);
startActivity(intent);
break;
case R.id.id3:
} else if (id == R.id.id3) {
// intent = new Intent(SettingActivity.this, AboutusActivity.class);
// startActivity(intent);
WebActivitytwo.runActivity(SettingActivity.this, "关于我们", "https://wy.dou1.net/articlemobile/index/detail?article_id=3");
break;
case R.id.id2:
} else if (id == R.id.id2) {
intent = new Intent(SettingActivity.this, AdeviseActivity.class);
startActivity(intent);
break;
case R.id.id1:
} else if (id == R.id.id1) {
progressDialog.setMessage("正在清理...");
progressDialog.setCancelable(false);
progressDialog.show();
handler.sendEmptyMessage(1);
break;
case R.id.loginout:
} else if (id == R.id.loginout) {
JPushInterface.deleteAlias(getApplicationContext(),0);
Config.getInstance(SettingActivity.this).DeleteUser();
MyApplication.getApp().existActivitys();
intent = new Intent(SettingActivity.this, LoginActivity.class);
startActivity(intent);
break;
}
}

View File

@@ -56,7 +56,7 @@ public class WebActivitytwo extends AppCompatActivity implements View.OnClickLis
webSettings.setBlockNetworkImage(false);//解决图片不显示
webSettings.setJavaScriptCanOpenWindowsAutomatically(true);
webSettings.setLoadsImagesAutomatically(true);
webSettings.setAppCacheEnabled(true);
// setAppCacheEnabled 已在 API 33 中移除,使用默认缓存设置
webSettings.setCacheMode(WebSettings.LOAD_DEFAULT);
// webView.getSettings().setJavaScriptEnabled(true);
webSettings.setSupportZoom(true);
@@ -98,14 +98,9 @@ public class WebActivitytwo extends AppCompatActivity implements View.OnClickLis
@Override
public void onClick(View v) {
switch (v.getId()) {
default:
break;
case R.id.webView:
break;
case R.id.layTop_left_tv:
int id = v.getId();
if (id == R.id.layTop_left_tv) {
finish();
break;
}
}
}

View File

@@ -410,7 +410,7 @@ public class AddDiscoveryActivity extends BaseActivity<ActivityAddDiscoveryBindi
//界面中缩略图的质量
.thumbnailScale(0.8f)
//蓝色主题
.theme(R.style.Matisse_Zhihu)
.theme(R.style.Matisse_Zhihu_Custom)
//Picasso加载方式
.imageEngine(new PicassoEngine())
//请求码

View File

@@ -173,7 +173,7 @@ public class DiscoveryFragment extends BaseFragment<FragmentDiscoveryBinding> im
//界面中缩略图的质量
.thumbnailScale(0.8f)
//蓝色主题
.theme(R.style.Matisse_Zhihu)
.theme(R.style.Matisse_Zhihu_Custom)
//Picasso加载方式
.imageEngine(new PicassoEngine())
//请求码

View File

@@ -119,8 +119,8 @@ public class AddAcarActivity extends BaseActivity<ActivityAddAcarBinding> implem
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.save:
int id = view.getId();
if (id == R.id.save) {
if (mDataBinding.editcarnumber.getText().toString().length() < 2) {
setToast(2, mDataBinding.editcarnumber.getHint().toString());
return;
@@ -175,7 +175,6 @@ public class AddAcarActivity extends BaseActivity<ActivityAddAcarBinding> implem
getGankList(ApiConfig.BASE_URL, map, getResources().getString(R.string.save), type);
break;
}
}

View File

@@ -333,8 +333,7 @@ public class HousekeepingActivity extends BaseActivity<ActivityHousekeepingBindi
webSettings.setJavaScriptCanOpenWindowsAutomatically(true); //支持通过JS打开新窗口
webSettings.setLoadsImagesAutomatically(true); //支持自动加载图片
webSettings.setDefaultTextEncodingName("utf-8");//设置编码格式
webSettings.setAppCachePath(getPackageCodePath() + "/myapp");
webSettings.setAppCacheMaxSize(10000);
// setAppCachePath 和 setAppCacheMaxSize 已在 API 33 中移除,使用默认缓存设置
//webview.loadUrl("www.baidu.com");
webview.setWebViewClient(new WebViewClient() {
@Override

View File

@@ -572,8 +572,8 @@ private String userHomeId="";
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.save:
int id = view.getId();
if (id == R.id.save) {
if (mDataBinding.titile.getText().toString().trim().length() < 1) {
setToast("请输入标题");
return;
@@ -612,13 +612,9 @@ private String userHomeId="";
}
douploadimges();
break;
case R.id.time:
} else if (id == R.id.time) {
initDatePicker();
break;
case R.id.typeText: {
} else if (id == R.id.typeText) {
final MyBottomSheetDialog dialog = new MyBottomSheetDialog(this);
SelectRepairWayDialog selectGenderDialog = new SelectRepairWayDialog(this, new SelectRepairWayDialog.SelectedItemOnClickListener() {
@Override
@@ -640,9 +636,6 @@ private String userHomeId="";
});
dialog.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
dialog.applyStyle(com.rey.material.R.style.Material_App_BottomSheetDialog).contentView(selectGenderDialog).cancelable(true).inDuration(100).heightParam(ViewGroup.LayoutParams.WRAP_CONTENT).show();
}
break;
}
}

View File

@@ -451,9 +451,8 @@ public class MyUserMessage extends BaseActivity<ActivityMyUserMessageBinding>
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.mybirthday:
int id = view.getId();
if (id == R.id.mybirthday) {
final String[] a = {""};
final DateTimeUtils dateTimeUtils = new DateTimeUtils(MyUserMessage.this);
@@ -484,10 +483,7 @@ public class MyUserMessage extends BaseActivity<ActivityMyUserMessageBinding>
}
});
break;
case R.id.mymale:
} else if (id == R.id.mymale) {
// final PopwindowLayoutGenderBinding popView = DataBindingUtil.inflate(LayoutInflater.from(this), R.layout.popwindow_layout_gender, null, false);
//
// final PopupWindowHelper popupWindowHelper = new PopupWindowHelper(popView.getRoot());
@@ -531,12 +527,8 @@ public class MyUserMessage extends BaseActivity<ActivityMyUserMessageBinding>
});
dialog.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
dialog.applyStyle(com.rey.material.R.style.Material_App_BottomSheetDialog).contentView(selectGenderDialog).cancelable(true).inDuration(100).heightParam(ViewGroup.LayoutParams.WRAP_CONTENT).show();
break;
case R.id.nickNameView:
} else if (id == R.id.nickNameView) {
// Handle nickNameView click
}
}

View File

@@ -423,9 +423,8 @@ public class MyshopEditAcitivity extends BaseActivity<ActivityMyshopEditAcitivit
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.save:
int id = view.getId();
if (id == R.id.save) {
if (mDataBinding.editTitile.getText().toString().trim().length() < 1) {
setToast("请输入标题");
return;
@@ -447,10 +446,6 @@ public class MyshopEditAcitivity extends BaseActivity<ActivityMyshopEditAcitivit
return;
}
douploadimges();
break;
}
}

View File

@@ -404,9 +404,8 @@ public class MyshopModifyAcitivity extends BaseActivity<ActivityMyshopEditAcitiv
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.save:
int id = view.getId();
if (id == R.id.save) {
if (mDataBinding.editTitile.getText().toString().trim().length() < 1) {
setToast("请输入标题");
return;
@@ -428,10 +427,6 @@ public class MyshopModifyAcitivity extends BaseActivity<ActivityMyshopEditAcitiv
return;
}
douploadimges();
break;
}
}

View File

@@ -343,10 +343,8 @@ public class ConfirmCarmoneyDialog extends Dialog {
public void onClick(View v) {
// TODO Auto-generated method stub
int id = v.getId();
switch (id) {
case R.id.title1:
if (id == R.id.title1) {
clickListenerInterface.doConfirm();
break;
}
}
}

View File

@@ -89,12 +89,8 @@ public class ConfirmDialog extends Dialog {
public void onClick(View v) {
// TODO Auto-generated method stub
int id = v.getId();
switch (id) {
case R.id.title1:
if (id == R.id.title1) {
clickListenerInterface.doConfirm();
break;
}
}

View File

@@ -86,12 +86,8 @@ public class ConfirmForGaranteeDetailDialog extends Dialog {
public void onClick(View v) {
// TODO Auto-generated method stub
int id = v.getId();
switch (id) {
case R.id.title1:
if (id == R.id.title1) {
clickListenerInterface.doConfirm();
break;
}
}

View File

@@ -94,12 +94,8 @@ public class ConfirmViewDialog extends Dialog {
public void onClick(View v) {
// TODO Auto-generated method stub
int id = v.getId();
switch (id) {
case R.id.title1:
if (id == R.id.title1) {
clickListenerInterface.doConfirm();
break;
}
}

View File

@@ -40,23 +40,17 @@ public class MyRadioButton extends RadioButton {
int n = a.getIndexCount();
for (int i = 0; i < n; i++) {
int attr = a.getIndex(i);
switch (attr) {
case R.styleable.MyRadioButton_drawableSize:
if (attr == R.styleable.MyRadioButton_drawableSize) {
mDrawableSize = a.getDimensionPixelSize(R.styleable.MyRadioButton_drawableSize, 50);
break;
case R.styleable.MyRadioButton_drawableTop:
} else if (attr == R.styleable.MyRadioButton_drawableTop) {
drawableTop = a.getDrawable(attr);
break;
case R.styleable.MyRadioButton_drawableBottom:
} else if (attr == R.styleable.MyRadioButton_drawableBottom) {
drawableRight = a.getDrawable(attr);
break;
case R.styleable.MyRadioButton_drawableRight:
} else if (attr == R.styleable.MyRadioButton_drawableRight) {
drawableBottom = a.getDrawable(attr);
break;
case R.styleable.MyRadioButton_drawableLeft:
} else if (attr == R.styleable.MyRadioButton_drawableLeft) {
drawableLeft = a.getDrawable(attr);
break;
default:
} else {
break;
}
}

View File

@@ -354,8 +354,8 @@ public class SelectPicDanimicActivity extends Activity implements OnClickListene
}
}
switch (v.getId()) {
case R.id.btn_take_photo:
int id = v.getId();
if (id == R.id.btn_take_photo) {
try {
@@ -378,8 +378,7 @@ public class SelectPicDanimicActivity extends Activity implements OnClickListene
} catch (Exception e) {
e.printStackTrace();
}
break;
case R.id.btn_pick_photo:
} else if (id == R.id.btn_pick_photo) {
try {
//选择照片的时候也一样,我们用Action为Intent.ACTION_GET_CONTENT,
//有些人使用其他的Action但我发现在有些机子中会出问题,所以优先选择这个
@@ -396,12 +395,8 @@ public class SelectPicDanimicActivity extends Activity implements OnClickListene
startActivityForResult(intent, 2);
} catch (ActivityNotFoundException e) {
}
break;
case R.id.btn_cancel:
} else if (id == R.id.btn_cancel) {
finish();
break;
default:
break;
}

View File

@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="#E0E0E0" />
<size
android:width="200dp"
android:height="200dp" />
</shape>

View File

@@ -36,4 +36,10 @@
<attr name="tvTextSize" format="dimension"/>
<attr name="btnTextSize" format="dimension"/>
</declare-styleable>
<declare-styleable name="SnackbarLayout">
<attr name="android:maxWidth" />
<attr name="maxActionInlineWidth" format="dimension" />
<attr name="elevation" format="dimension" />
</declare-styleable>
</resources>

View File

@@ -1,2 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<resources></resources>
<resources>
<dimen name="design_snackbar_padding_vertical">14dp</dimen>
<dimen name="design_snackbar_padding_vertical_2lines">20dp</dimen>
</resources>

View File

@@ -135,4 +135,11 @@
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowNoTitle">true</item>
</style>
<!-- Matisse 图片选择器主题 -->
<style name="Matisse_Zhihu_Custom" parent="Theme.AppCompat.Light.NoActionBar">
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
</style>
</resources>

View File

@@ -2,13 +2,23 @@
buildscript {
ext {
agp_version = '8.7.3'
kotlin_version = '1.9.24'
}
repositories {
maven { url 'https://maven.aliyun.com/nexus/content/groups/public/' }
maven { url 'https://maven.aliyun.com/repository/public' }//jcenter
maven { url 'https://maven.aliyun.com/repository/gradle-plugin' }//gradle-plugin
maven { url 'https://maven.aliyun.com/repository/central' }//central
maven { url 'https://maven.aliyun.com/repository/google' }//google
google()
jcenter()
mavenCentral()
maven { url "https://jitpack.io" }
}
dependencies {
classpath 'com.android.tools.build:gradle:4.2.2'
classpath "com.android.tools.build:gradle:$agp_version"
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
@@ -17,9 +27,21 @@ buildscript {
allprojects {
repositories {
jcenter()
maven { url "https://jitpack.io" }
maven { url 'https://maven.aliyun.com/nexus/content/groups/public/' }
maven { url 'https://maven.aliyun.com/repository/public' }//jcenter
maven { url 'https://maven.aliyun.com/repository/gradle-plugin' }//gradle-plugin
maven { url 'https://maven.aliyun.com/repository/central' }//central
maven { url 'https://maven.aliyun.com/repository/google' }//google
google()
mavenCentral()
maven { url "https://jitpack.io" }
}
// 统一配置所有 Kotlin 编译任务的 JVM 目标版本
tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).configureEach {
kotlinOptions {
jvmTarget = '1.8'
}
}
}

View File

@@ -14,3 +14,16 @@ org.gradle.jvmargs=-Xmx1536m
android.injected.testOnly=false
android.useAndroidX=true
android.enableJetifier=true
# SSL Certificate handling - fixes PKIX path building failed error
# Use JKS for Java 11+ compatibility
systemProp.javax.net.ssl.trustStoreType=JKS
# If you still encounter SSL errors, you can temporarily disable SSL verification
# WARNING: Only use this for development, not in production!
# Uncomment the following lines as a last resort:
# org.gradle.jvmargs=-Xmx1536m -Dtrust_all_cert=true
android.enableJetifier=true
# Suppress deprecation warnings for Java 8 source/target
android.javaCompile.suppressSourceTargetDeprecationWarning=true

View File

@@ -1,6 +1,6 @@
#Wed Dec 08 14:35:23 CST 2021
#Wed Jan 07 00:50:53 CST 2026
distributionBase=GRADLE_USER_HOME
distributionUrl=https\://services.gradle.org/distributions/gradle-6.7.1-bin.zip
distributionPath=wrapper/dists
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

View File

@@ -1,7 +1,8 @@
apply plugin: 'com.android.library'
android {
compileSdkVersion 30
buildToolsVersion '30.0.2'
namespace "com.lzy.ninegrid"
compileSdkVersion 33
// buildToolsVersion 在 AGP 8.0+ 中不再需要,会自动使用默认版本
defaultConfig {
minSdkVersion 21
@@ -21,10 +22,10 @@ android {
}
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
compile 'androidx.appcompat:appcompat:1.0.0'
compile 'androidx.annotation:annotation:1.0.0'
compile 'com.github.chrisbanes.photoview:library:1.2.4'
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation 'androidx.appcompat:appcompat:1.0.0'
implementation 'androidx.annotation:annotation:1.0.0'
implementation 'com.github.chrisbanes.photoview:library:1.2.4'
implementation files('../app/libs/pldroid-player-2.1.9.jar')

View File

@@ -0,0 +1,452 @@
# Android 项目配置环境文档
## 一、项目基本信息
### 1.1 项目信息
- **项目名称**: HouseProperty (房产物业管理)
- **包名**: com.sl.HouseProperty
- **命名空间**: com.sl.house_property
- **版本号**: 1.1.9
- **版本代码**: 119
- **项目路径**: D:\Users\86181\AndroidStudioProjects\HouseProperty
### 1.2 应用配置
- **ApplicationId**: com.sl.HouseProperty
- **最小SDK版本**: 21 (Android 5.0 Lollipop)
- **目标SDK版本**: 29 (Android 10)
- **编译SDK版本**: 33 (Android 13)
- **测试运行器**: androidx.test.runner.AndroidJUnitRunner
---
## 二、开发环境配置
### 2.1 Java 环境
- **系统Java版本**: 1.8.0_101 (Java 8)
- **项目要求Java版本**: Java 11+ (推荐使用 Android Studio JDK 21)
- **JAVA_HOME**: C:\Program Files\Android\Android Studio1\jbr
- **编译目标**: Java 8 (sourceCompatibility & targetCompatibility)
- **Kotlin JVM目标**: 1.8
⚠️ **注意**: 项目要求Java 11+,但系统Java是1.8,需要使用Android Studio内置JDK
### 2.2 Android SDK 环境
- **ANDROID_HOME**: C:\Users\86181\AppData\Local\Android\Sdk
- **SDK路径**: C:\Users\86181\AppData\Local\Android\Sdk
- **NDK配置**:
- ABI过滤器: armeabi-v7a
- 支持的架构: armeabi, armeabi-v7a, arm64-v8a, x86
### 2.3 构建工具版本
#### Gradle 配置
- **Gradle版本**: 8.9
- **Gradle分发URL**: https://services.gradle.org/distributions/gradle-8.9-bin.zip
- **Gradle用户目录**: GRADLE_USER_HOME
- **Gradle JVM参数**: -Xmx1536m
#### Android Gradle Plugin (AGP)
- **AGP版本**: 8.7.3
- **构建工具**: 自动使用默认版本(AGP 8.0+不再需要buildToolsVersion)
#### Kotlin 配置
- **Kotlin版本**: 1.9.24
- **Kotlin插件**: org.jetbrains.kotlin:kotlin-gradle-plugin:1.9.24
- **Kotlin标准库**: kotlin-stdlib:1.9.24
---
## 三、项目模块结构
### 3.1 模块列表
```
HouseProperty/
├── app/ # 主应用模块
└── ninegridview/ # 自定义九宫格图片显示模块
```
### 3.2 模块配置
- **主模块**: app (com.android.application)
- **子模块**: ninegridview (library)
- **模块依赖**: app 依赖 ninegridview
---
## 四、构建配置
### 4.1 构建类型 (Build Types)
#### Debug 构建
- **代码混淆**: 禁用 (minifyEnabled false)
- **签名配置**: defaultSignature
- **调试信息**: 包含
#### Release 构建
- **代码混淆**: 禁用 (minifyEnabled false) ⚠️ **安全风险**
- **签名配置**: 已注释(未启用)
- **ProGuard规则**: proguard-android.txt + proguard-rules.pro
### 4.2 签名配置
```gradle
signingConfigs {
defaultSignature {
keyAlias: 'key0'
keyPassword: 'haotian'
storeFile: 'haotian.jks'
storePassword: 'haotian'
}
}
```
⚠️ **安全警告**: 签名密钥硬编码在build.gradle中,存在安全风险
### 4.3 打包配置
- **排除文件**:
- META-INF/DEPENDENCIES
- META-INF/NOTICE
- META-INF/LICENSE
- META-INF/LICENSE.txt
- META-INF/NOTICE.txt
### 4.4 资源处理
- **AAPT选项**:
- cruncherEnabled: false
- useNewCruncher: false (已废弃)
- **资源目录**:
- assets: src/main/assets
- jniLibs: libs
### 4.5 Lint 配置
- **错误中断**: 禁用 (abortOnError false)
- **警告**: 不中断构建
---
## 五、功能特性配置
### 5.1 已启用特性
- ✅ **DataBinding**: 已启用
- ✅ **MultiDex**: 已配置(androidx.multidex:multidex:2.0.1)
- ✅ **AndroidX**: 已启用 (android.useAndroidX=true)
- ✅ **Jetifier**: 已启用 (android.enableJetifier=true)
### 5.2 Manifest占位符
```gradle
manifestPlaceholders = [
JPUSH_PKGNAME: applicationId,
JPUSH_APPKEY: "4b6e03f9cc9466efbc0b2528",
JPUSH_CHANNEL: "developer-default"
]
```
---
## 六、依赖库配置
### 6.1 仓库配置 (Repositories)
#### Maven 仓库
1. **阿里云Maven镜像** (主要仓库)
- https://maven.aliyun.com/nexus/content/groups/public/
- https://maven.aliyun.com/repository/public
- https://maven.aliyun.com/repository/gradle-plugin
- https://maven.aliyun.com/repository/central
- https://maven.aliyun.com/repository/google
2. **官方仓库**
- Google Maven
- Maven Central
- JitPack
3. **本地仓库**
- flatDir: libs目录
### 6.2 核心依赖库
#### Kotlin 相关
- kotlin-stdlib: 1.9.24
- kotlin-gradle-plugin: 1.9.24
#### AndroidX / Support Library
- androidx.multidex:multidex: 2.0.1
- com.android.support:appcompat-v7: 28.0.0 ⚠️ **应迁移到AndroidX**
#### 网络请求
- com.squareup.retrofit2:retrofit: 2.1.0 ⚠️ **版本过旧(2016年)**
- com.squareup.retrofit2:converter-gson: 2.1.0
- com.squareup.retrofit2:adapter-rxjava: 2.1.0
- com.squareup.okhttp3:logging-interceptor: 3.4.1
- com.lzy.net:okgo: 3.0.4
- com.lzy.net:okrx2: 2.0.2
#### 响应式编程
- io.reactivex:rxjava: 1.1.0 ⚠️ **版本过旧,已停止维护**
- io.reactivex:rxandroid: 1.1.0
- io.reactivex.rxjava2:rxjava: 2.1.5 ⚠️ **混用RxJava 1和2**
- io.reactivex.rxjava2:rxandroid: 2.1.1
- com.trello:rxlifecycle: + (最新版本)
- com.trello:rxlifecycle-components: + (最新版本)
#### 图片加载
- com.github.bumptech.glide:glide: 4.9.0 ✅
- com.squareup.picasso:picasso: 2.5.2 ⚠️ **与Glide混用,建议移除**
- com.github.chrisbanes:PhotoView: 2.0.0
#### JSON 处理
- com.google.code.gson:gson: 2.6.2 ⚠️ **版本过旧(2016年)**
#### UI 组件
- com.scwang.smartrefresh:SmartRefreshLayout: 1.1.0
- com.gyf.immersionbar:immersionbar: 3.0.0
- com.lxj:xpopup: 1.8.10
- com.youth.banner:banner: 1.4.10
- com.jcodecraeer:xrecyclerview: 1.3.2
- com.github.CymChad:BaseRecyclerViewAdapterHelper: 2.9.30
- com.nineoldandroids:library: 2.4.0
#### 数据库
- com.j256.ormlite:ormlite-core: 5.1
- com.j256.ormlite:ormlite-android: 5.1
#### 权限管理
- com.hjq:xxpermissions: 5.5
- com.tbruyelle.rxpermissions2:rxpermissions: 0.9.5
#### 图片/视频选择
- com.zhihu.android:matisse: 0.5.3-beta3
- io.github.lucksiege:pictureselector: v2.7.3-rc05
- fm.jiecao:jiecaovideoplayer: 4.8.3
#### 支付相关
- alipaySdk-15.5.9.aar (本地AAR)
- com.tencent.mm.opensdk:wechat-sdk-android-without-mta: + (最新版本)
#### 推送服务
- cn.jiguang.sdk:jpush: 3.6.6
- cn.jiguang.sdk:jcore: 2.3.8
#### 其他工具库
- com.tencent.bugly:crashreport: latest.release
- top.zibin:Luban: 1.1.8 (图片压缩)
- com.google.zxing:core: 3.3.0 (二维码)
- tech.wangjie:qrcodetools: 1.0.0
- liji.library.dev:citypickerview: 5.2.2
- me.jessyan:autosize: 1.1.2 (屏幕适配)
- com.arialyy.aria:Aria: 3.1.1 (下载框架)
- net.dankito.richtexteditor:richtexteditor-android: 2.0.8
### 6.3 本地依赖 (libs目录)
#### AAR 文件
- alipaySdk-15.5.9.aar (支付宝SDK)
- cutil-release.aar (自定义工具库)
- selectpicker-release.aar (选择器)
- gifdecoder-4.5.0.aar
- glide-4.5.0.aar
- glide-4.6.1.aar
- material-1.2.5.aar
- PhotoView-2.0.0.aar
#### JAR 文件
- fastjson-1.2.7.jar
- pldroid-player-2.1.9.jar (播放器SDK)
#### 本地SO库 (Native Libraries)
- **armeabi-v7a**:
- libqcOpenSSL.so
- libQPlayer.so
- **armeabi**:
- libqcOpenSSL.so
- libQPlayer.so
- **arm64-v8a**:
- libqcOpenSSL.so
- libQPlayer.so
- **x86**:
- libqcOpenSSL.so
- libQPlayer.so
---
## 七、Gradle 配置详情
### 7.1 gradle.properties 配置
```properties
# JVM参数
org.gradle.jvmargs=-Xmx1536m
# AndroidX配置
android.useAndroidX=true
android.enableJetifier=true
# 测试配置
android.injected.testOnly=false
# Java编译配置
android.javaCompile.suppressSourceTargetDeprecationWarning=true
# SSL证书配置
systemProp.javax.net.ssl.trustStoreType=JKS
```
### 7.2 local.properties 配置
```properties
sdk.dir=C\:\\Users\\86181\\AppData\\Local\\Android\\Sdk
```
### 7.3 settings.gradle 配置
```gradle
include ':app',':ninegridview'
```
---
## 八、编译环境要求
### 8.1 必需环境
- ✅ **JDK**: Java 11+ (推荐 Android Studio JDK 21)
- ✅ **Android SDK**: API Level 33
- ✅ **Gradle**: 8.9
- ✅ **Android Gradle Plugin**: 8.7.3
- ✅ **Kotlin**: 1.9.24
### 8.2 推荐环境变量设置
```powershell
# 设置Java环境(编译时使用)
$env:JAVA_HOME="C:\Program Files\Android\Android Studio1\jbr"
# 设置Android SDK路径
$env:ANDROID_HOME="C:\Users\$env:USERNAME\AppData\Local\Android\Sdk"
```
### 8.3 编译命令
```bash
# Debug版本编译
$env:JAVA_HOME="C:\Program Files\Android\Android Studio1\jbr"; $env:ANDROID_HOME="C:\Users\$env:USERNAME\AppData\Local\Android\Sdk"; .\gradlew.bat assembleDebug
# Release版本编译
$env:JAVA_HOME="C:\Program Files\Android\Android Studio1\jbr"; $env:ANDROID_HOME="C:\Users\$env:USERNAME\AppData\Local\Android\Sdk"; .\gradlew.bat assembleRelease
# 清理项目
.\gradlew.bat clean
```
---
## 九、已知配置问题
### 9.1 ⚠️ 高优先级问题
1. **签名密钥硬编码**
- 位置: app/build.gradle
- 风险: 安全漏洞
- 建议: 移至gradle.properties或使用密钥管理服务
2. **代码混淆未启用**
- Release版本: minifyEnabled false
- 风险: 代码容易被反编译
- 建议: 启用混淆并配置规则
3. **依赖版本过旧**
- Retrofit: 2.1.0 (2016年)
- RxJava: 1.1.0 (已停止维护)
- Gson: 2.6.2 (存在安全漏洞)
- 建议: 升级到最新稳定版本
4. **混用多个版本库**
- RxJava 1.x 和 RxJava 2.x 混用
- Glide 和 Picasso 混用
- 建议: 统一使用一个版本/库
### 9.2 ⚠️ 中优先级问题
1. **Support Library未完全迁移**
- 仍使用 com.android.support:appcompat-v7:28.0.0
- 建议: 完全迁移到AndroidX
2. **targetSdkVersion过旧**
- 当前: 29 (Android 10)
- 建议: 升级到33+ (Android 13)
3. **使用flatDir加载本地AAR**
- 不推荐使用flatDir
- 建议: 使用本地Maven仓库或发布到私有仓库
### 9.3 ⚠️ 低优先级问题
1. **Gradle JVM内存配置**
- 当前: 1536m
- 建议: 根据项目大小调整(建议2048m+)
2. **NDK ABI过滤器**
- 当前: 仅支持 armeabi-v7a
- 建议: 根据需求添加 arm64-v8a
---
## 十、环境检查清单
### 10.1 开发环境检查
- [ ] JDK 11+ 已安装并配置
- [ ] Android SDK 已安装(API 33)
- [ ] Android Studio 已安装
- [ ] Gradle 8.9 已下载
- [ ] 环境变量已配置(JAVA_HOME, ANDROID_HOME)
### 10.2 项目配置检查
- [ ] build.gradle 配置正确
- [ ] local.properties 配置正确
- [ ] gradle.properties 配置正确
- [ ] 签名文件存在(haotian.jks)
- [ ] 依赖库可正常下载
### 10.3 编译检查
- [ ] 项目可正常同步
- [ ] Debug版本可正常编译
- [ ] Release版本可正常编译
- [ ] 无编译错误和警告
---
## 十一、配置优化建议
### 11.1 立即优化
1. 移除硬编码的签名密钥
2. 启用Release版本代码混淆
3. 升级关键依赖库版本
### 11.2 短期优化
1. 统一依赖库版本(移除混用)
2. 完全迁移到AndroidX
3. 升级targetSdkVersion
### 11.3 长期优化
1. 使用依赖版本管理(Version Catalog)
2. 建立CI/CD流程
3. 配置代码质量检查工具
---
## 十二、配置参考
### 12.1 推荐JDK配置
```powershell
# PowerShell环境变量设置(临时)
$env:JAVA_HOME="C:\Program Files\Android\Android Studio1\jbr"
$env:ANDROID_HOME="C:\Users\$env:USERNAME\AppData\Local\Android\Sdk"
$env:PATH="$env:JAVA_HOME\bin;$env:ANDROID_HOME\platform-tools;$env:PATH"
```
### 12.2 推荐Gradle配置
```properties
# gradle.properties
org.gradle.jvmargs=-Xmx2048m -XX:MaxMetaspaceSize=512m
org.gradle.parallel=true
org.gradle.caching=true
org.gradle.daemon=true
```
---
**文档生成时间**: 2025年1月
**项目路径**: D:\Users\86181\AndroidStudioProjects\HouseProperty
**配置检查**: 基于当前项目文件分析

382
项目点评.txt Normal file
View File

@@ -0,0 +1,382 @@
# Android 房产物业管理项目 - 项目点评报告
## 项目概述
- **项目名称**: HouseProperty (房产物业管理)
- **包名**: com.sl.HouseProperty
- **版本**: 1.1.9 (versionCode: 119)
- **项目类型**: Android 原生应用
- **开发语言**: Java + Kotlin 混合开发
- **构建工具**: Gradle 8.9, Android Gradle Plugin 8.7.3
---
## 一、项目结构分析
### 1.1 目录结构
✅ **优点**:
- 模块化设计,包含主应用模块和 ninegridview 自定义模块
- 代码按功能分类(user、discovery、order、cart等)
- 工具类和实体类分离清晰
⚠️ **问题**:
- 包结构层次较深,部分类组织不够清晰
- 存在大量Activity类(122个Java文件),建议考虑Fragment化
- 缺少统一的架构层(如Repository、ViewModel等)
### 1.2 代码组织
- **Activity数量**: 约50+个Activity,数量较多
- **Fragment使用**: 部分使用Fragment,但不够统一
- **自定义View**: 有较多自定义View组件
- **工具类**: utils和tools包下有较多工具类
---
## 二、技术栈评估
### 2.1 核心技术
✅ **已采用**:
- DataBinding(数据绑定)
- Kotlin(部分使用)
- Retrofit + RxJava(网络请求)
- ORMLite(数据库)
- Glide(图片加载)
- 极光推送(JPush)
### 2.2 依赖库分析
#### ⚠️ **严重问题 - 依赖版本过旧**:
1. **Retrofit 2.1.0** (2016年版本)
- 当前最新: 2.9.0+
- 风险: 存在安全漏洞,功能缺失
2. **RxJava 1.1.0** (2016年版本)
- 当前最新: RxJava 3.x
- 风险: 已停止维护,性能问题
3. **Gson 2.6.2** (2016年版本)
- 当前最新: 2.10.1+
- 风险: 安全漏洞
4. **Picasso 2.5.2** (2016年版本)
- 建议: 统一使用Glide,移除Picasso
5. **Support Library 28.0.0**
- 问题: 应迁移到AndroidX
- 当前项目已部分使用AndroidX,存在混用情况
#### ✅ **依赖管理建议**:
- 统一使用AndroidX,移除Support Library
- 升级所有依赖到最新稳定版本
- 移除未使用的依赖(如Picasso,项目已使用Glide)
- 使用依赖版本管理(version catalog)
### 2.3 第三方库使用情况
- **网络库**: Retrofit + OkHttp + OkGo(混用,建议统一)
- **图片加载**: Glide + Picasso(混用,建议只保留Glide)
- **响应式编程**: RxJava 1.x + RxJava 2.x(混用,建议统一到RxJava 3)
- **数据库**: ORMLite(较旧,建议迁移到Room)
- **UI组件**: 大量自定义View和第三方UI库
---
## 三、代码质量分析
### 3.1 编译问题(已修复)
✅ **已解决**:
- Matisse样式资源冲突(已重命名为Matisse_Zhihu_Custom)
- Switch语句中使用R.id问题(已改为if-else)
- 语法错误(多余的花括号)
### 3.2 代码规范问题
#### ⚠️ **命名规范**:
- 部分类名拼写错误:`MyshopEditAcitivity` → `MyshopEditActivity`
- 部分类名不符合规范:`AddAnewGranteeActivity`(建议:`AddGranteeActivity`)
- 变量命名不够统一
#### ⚠️ **代码结构**:
- 大量Activity直接处理业务逻辑,缺少分层
- 网络请求代码分散在各Activity中
- 缺少统一的错误处理机制
- 硬编码较多(如API地址、密钥等)
#### ⚠️ **注释和文档**:
- 代码注释较少
- 缺少类和方法级别的文档注释
- 部分注释为中文,部分为英文,不统一
### 3.3 架构设计
#### ❌ **当前架构问题**:
1. **无明确架构模式**
- 传统MVC,但Model层不清晰
- 业务逻辑直接写在Activity中
- 缺少Repository层和ViewModel层
2. **BaseActivity使用**
- ✅ 有BaseActivity基类,提供统一功能
- ⚠️ 但子类仍然承担过多职责
3. **数据层**
- 使用ORMLite,但缺少统一的数据访问层
- 网络请求和本地存储逻辑分散
#### ✅ **架构改进建议**:
1. **采用MVVM架构**
- Activity/Fragment → ViewModel → Repository → DataSource
- 使用LiveData或RxJava进行数据观察
2. **引入依赖注入**
- 使用Dagger Hilt或Koin
- 解耦组件依赖
3. **统一数据层**
- Repository模式统一数据访问
- Room替代ORMLite
- 网络层统一封装
---
## 四、安全性分析
### 4.1 ⚠️ **严重安全问题**
1. **签名密钥硬编码**
```gradle
signingConfigs {
defaultSignature {
keyAlias 'key0'
keyPassword 'haotian'
storeFile file('haotian.jks')
storePassword 'haotian'
}
}
```
**风险**: 密钥泄露,任何人都可以签名应用
**建议**:
- 使用gradle.properties存储密钥信息
- 添加到.gitignore
- 使用密钥管理服务
2. **API密钥硬编码**
- JPush AppKey直接写在build.gradle中
- 建议使用BuildConfig或配置文件
3. **ProGuard配置**
- Release版本未启用代码混淆(minifyEnabled false)
- 风险:代码容易被反编译
- 建议:启用混淆,配置混淆规则
### 4.2 权限管理
- 权限声明较多,部分可能未使用
- 缺少运行时权限检查的统一封装
- AndroidManifest中存在重复权限声明
---
## 五、性能分析
### 5.1 构建配置
#### ✅ **优点**:
- 使用Gradle 8.9和AGP 8.7.3(较新版本)
- 配置了Kotlin支持
- 使用阿里云Maven镜像加速
#### ⚠️ **问题**:
- targetSdkVersion 29(较旧,建议升级到33+)
- minSdkVersion 21(Android 5.0),可考虑提升
- 未启用代码混淆和资源压缩
- 使用flatDir加载本地AAR(不推荐)
### 5.2 运行时性能
#### ⚠️ **潜在问题**:
1. **内存管理**
- Application中维护Activity列表(可能内存泄漏)
- 缺少内存泄漏检测工具(如LeakCanary)
2. **网络请求**
- 混用多个网络库,可能造成重复请求
- 缺少请求缓存机制
3. **图片加载**
- 同时使用Glide和Picasso,增加APK体积
- 缺少图片压缩和缓存策略
4. **数据库**
- ORMLite性能不如Room
- 缺少数据库迁移机制
---
## 六、兼容性和维护性
### 6.1 Android版本兼容
- **minSdkVersion**: 21 (Android 5.0) - 覆盖约95%设备
- **targetSdkVersion**: 29 (Android 10) - 需要升级到33+
- **compileSdkVersion**: 33 - 正常
### 6.2 代码维护性
#### ❌ **问题**:
1. **代码重复**
- 多个Activity中有相似的网络请求代码
- 缺少统一的工具类封装
2. **耦合度高**
- Activity之间直接跳转,缺少路由管理
- 业务逻辑和UI耦合
3. **测试覆盖**
- 未看到单元测试代码
- 缺少UI测试
4. **版本控制**
- 可能存在大文件未使用.gitignore
- 签名文件应排除在版本控制外
---
## 七、功能完整性
### 7.1 核心功能模块
根据代码分析,项目包含以下功能:
- ✅ 用户登录/注册
- ✅ 房产管理
- ✅ 物业服务(报修、缴费等)
- ✅ 发现/社区功能
- ✅ 购物车/订单
- ✅ 消息推送
- ✅ 支付功能(支付宝、微信)
### 7.2 功能实现质量
- 功能较完整,但代码组织需要优化
- 部分功能可能存在边界情况处理不足
---
## 八、改进建议优先级
### 🔴 **高优先级(必须修复)**
1. **安全性问题**
- [ ] 移除硬编码的签名密钥
- [ ] 启用ProGuard代码混淆
- [ ] 将敏感信息移至配置文件
2. **依赖升级**
- [ ] 升级Retrofit到2.9.0+
- [ ] 统一RxJava版本(建议RxJava 3)
- [ ] 迁移到AndroidX
- [ ] 升级Gson到最新版本
3. **代码规范**
- [ ] 修复类名拼写错误
- [ ] 统一代码风格
- [ ] 添加代码注释
### 🟡 **中优先级(建议修复)**
1. **架构优化**
- [ ] 引入MVVM架构
- [ ] 统一网络请求层
- [ ] 引入依赖注入框架
2. **性能优化**
- [ ] 移除未使用的依赖
- [ ] 统一图片加载库(只使用Glide)
- [ ] 添加内存泄漏检测
3. **代码质量**
- [ ] 添加单元测试
- [ ] 引入代码检查工具(Lint、FindBugs)
- [ ] 统一错误处理机制
### 🟢 **低优先级(可选优化)**
1. **技术升级**
- [ ] 迁移ORMLite到Room
- [ ] 引入协程替代RxJava
- [ ] 使用Compose重构部分UI
2. **开发体验**
- [ ] 添加CI/CD流程
- [ ] 完善项目文档
- [ ] 统一开发规范文档
---
## 九、总体评价
### 9.1 项目评分(满分10分)
| 评估项 | 得分 | 说明 |
|--------|------|------|
| **功能完整性** | 8/10 | 功能较完整,覆盖主要业务场景 |
| **代码质量** | 5/10 | 存在较多问题,需要重构 |
| **架构设计** | 4/10 | 缺少清晰架构,耦合度高 |
| **安全性** | 3/10 | 存在严重安全隐患 |
| **性能** | 6/10 | 基本满足需求,有优化空间 |
| **可维护性** | 4/10 | 代码组织混乱,维护困难 |
| **技术栈** | 5/10 | 依赖版本过旧,需要升级 |
| **文档** | 3/10 | 缺少文档和注释 |
**综合评分: 4.75/10**
### 9.2 项目状态
- **当前状态**: ⚠️ **需要重大改进**
- **可维护性**: ❌ **较差**
- **技术债务**: 🔴 **高**
### 9.3 改进路线图
#### 第一阶段(1-2个月)- 基础修复
1. 修复安全性问题
2. 升级关键依赖
3. 修复编译错误和代码规范问题
4. 启用代码混淆
#### 第二阶段(2-3个月)- 架构优化
1. 迁移到AndroidX
2. 统一网络请求层
3. 引入MVVM架构
4. 添加单元测试
#### 第三阶段(3-6个月)- 深度优化
1. 重构核心模块
2. 性能优化
3. 完善文档
4. 建立CI/CD
---
## 十、总结
### 优点
✅ 功能相对完整,能够满足业务需求
✅ 使用了DataBinding等现代Android技术
✅ 有BaseActivity等基础架构
✅ 模块化设计有一定基础
### 主要问题
❌ 安全性存在严重隐患(密钥硬编码)
❌ 依赖版本过旧,存在安全风险
❌ 代码质量不高,缺少规范
❌ 架构设计不清晰,耦合度高
❌ 缺少测试和文档
### 建议
这是一个**功能完整但技术债务较高**的项目。建议:
1. **立即修复安全性问题**
2. **制定重构计划,分阶段执行**
3. **建立代码规范和开发流程**
4. **引入现代化架构和工具**
---
**报告生成时间**: 2025年1月
**项目路径**: D:\Users\86181\AndroidStudioProjects\HouseProperty
**分析工具**: 代码审查 + 静态分析