期末作业

master
lkw 2 years ago
parent c61ee05811
commit b6ca945d89

14
.gitignore vendored

@ -0,0 +1,14 @@
*.iml
.gradle
/local.properties
/.idea/caches
/.idea/libraries
/.idea/modules.xml
/.idea/workspace.xml
/.idea/navEditor.xml
/.idea/assetWizardSettings.xml
.DS_Store
/build
/captures
.externalNativeBuild
.cxx

@ -0,0 +1,116 @@
<component name="ProjectCodeStyleConfiguration">
<code_scheme name="Project" version="173">
<codeStyleSettings language="XML">
<indentOptions>
<option name="CONTINUATION_INDENT_SIZE" value="4" />
</indentOptions>
<arrangement>
<rules>
<section>
<rule>
<match>
<AND>
<NAME>xmlns:android</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>^$</XML_NAMESPACE>
</AND>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>xmlns:.*</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>^$</XML_NAMESPACE>
</AND>
</match>
<order>BY_NAME</order>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>.*:id</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
</AND>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>.*:name</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
</AND>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>name</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>^$</XML_NAMESPACE>
</AND>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>style</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>^$</XML_NAMESPACE>
</AND>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>.*</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>^$</XML_NAMESPACE>
</AND>
</match>
<order>BY_NAME</order>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>.*</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
</AND>
</match>
<order>ANDROID_ATTRIBUTE_ORDER</order>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>.*</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>.*</XML_NAMESPACE>
</AND>
</match>
<order>BY_NAME</order>
</rule>
</section>
</rules>
</arrangement>
</codeStyleSettings>
</code_scheme>
</component>

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

@ -0,0 +1,414 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="DBNavigator.Project.DataEditorManager">
<record-view-column-sorting-type value="BY_INDEX" />
<value-preview-text-wrapping value="true" />
<value-preview-pinned value="false" />
</component>
<component name="DBNavigator.Project.DatabaseEditorStateManager">
<last-used-providers />
</component>
<component name="DBNavigator.Project.DatabaseFileManager">
<open-files />
</component>
<component name="DBNavigator.Project.Settings">
<connections />
<browser-settings>
<general>
<display-mode value="TABBED" />
<navigation-history-size value="100" />
<show-object-details value="false" />
</general>
<filters>
<object-type-filter>
<object-type name="SCHEMA" enabled="true" />
<object-type name="USER" enabled="true" />
<object-type name="ROLE" enabled="true" />
<object-type name="PRIVILEGE" enabled="true" />
<object-type name="CHARSET" enabled="true" />
<object-type name="TABLE" enabled="true" />
<object-type name="VIEW" enabled="true" />
<object-type name="MATERIALIZED_VIEW" enabled="true" />
<object-type name="NESTED_TABLE" enabled="true" />
<object-type name="COLUMN" enabled="true" />
<object-type name="INDEX" enabled="true" />
<object-type name="CONSTRAINT" enabled="true" />
<object-type name="DATASET_TRIGGER" enabled="true" />
<object-type name="DATABASE_TRIGGER" enabled="true" />
<object-type name="SYNONYM" enabled="true" />
<object-type name="SEQUENCE" enabled="true" />
<object-type name="PROCEDURE" enabled="true" />
<object-type name="FUNCTION" enabled="true" />
<object-type name="PACKAGE" enabled="true" />
<object-type name="TYPE" enabled="true" />
<object-type name="TYPE_ATTRIBUTE" enabled="true" />
<object-type name="ARGUMENT" enabled="true" />
<object-type name="DIMENSION" enabled="true" />
<object-type name="CLUSTER" enabled="true" />
<object-type name="DBLINK" enabled="true" />
</object-type-filter>
</filters>
<sorting>
<object-type name="COLUMN" sorting-type="NAME" />
<object-type name="FUNCTION" sorting-type="NAME" />
<object-type name="PROCEDURE" sorting-type="NAME" />
<object-type name="ARGUMENT" sorting-type="POSITION" />
<object-type name="TYPE ATTRIBUTE" sorting-type="POSITION" />
</sorting>
<default-editors>
<object-type name="VIEW" editor-type="SELECTION" />
<object-type name="PACKAGE" editor-type="SELECTION" />
<object-type name="TYPE" editor-type="SELECTION" />
</default-editors>
</browser-settings>
<navigation-settings>
<lookup-filters>
<lookup-objects>
<object-type name="SCHEMA" enabled="true" />
<object-type name="USER" enabled="false" />
<object-type name="ROLE" enabled="false" />
<object-type name="PRIVILEGE" enabled="false" />
<object-type name="CHARSET" enabled="false" />
<object-type name="TABLE" enabled="true" />
<object-type name="VIEW" enabled="true" />
<object-type name="MATERIALIZED VIEW" enabled="true" />
<object-type name="INDEX" enabled="true" />
<object-type name="CONSTRAINT" enabled="true" />
<object-type name="DATASET TRIGGER" enabled="true" />
<object-type name="DATABASE TRIGGER" enabled="true" />
<object-type name="SYNONYM" enabled="false" />
<object-type name="SEQUENCE" enabled="true" />
<object-type name="PROCEDURE" enabled="true" />
<object-type name="FUNCTION" enabled="true" />
<object-type name="PACKAGE" enabled="true" />
<object-type name="TYPE" enabled="true" />
<object-type name="DIMENSION" enabled="false" />
<object-type name="CLUSTER" enabled="false" />
<object-type name="DBLINK" enabled="true" />
</lookup-objects>
<force-database-load value="false" />
<prompt-connection-selection value="true" />
<prompt-schema-selection value="true" />
</lookup-filters>
</navigation-settings>
<dataset-grid-settings>
<general>
<enable-zooming value="true" />
<enable-column-tooltip value="true" />
</general>
<sorting>
<nulls-first value="true" />
<max-sorting-columns value="4" />
</sorting>
<audit-columns>
<column-names value="" />
<visible value="true" />
<editable value="false" />
</audit-columns>
</dataset-grid-settings>
<dataset-editor-settings>
<text-editor-popup>
<active value="false" />
<active-if-empty value="false" />
<data-length-threshold value="100" />
<popup-delay value="1000" />
</text-editor-popup>
<values-actions-popup>
<show-popup-button value="true" />
<element-count-threshold value="1000" />
<data-length-threshold value="250" />
</values-actions-popup>
<general>
<fetch-block-size value="100" />
<fetch-timeout value="30" />
<trim-whitespaces value="true" />
<convert-empty-strings-to-null value="true" />
<select-content-on-cell-edit value="true" />
<large-value-preview-active value="true" />
</general>
<filters>
<prompt-filter-dialog value="true" />
<default-filter-type value="BASIC" />
</filters>
<qualified-text-editor text-length-threshold="300">
<content-types>
<content-type name="Text" enabled="true" />
<content-type name="Properties" enabled="true" />
<content-type name="XML" enabled="true" />
<content-type name="DTD" enabled="true" />
<content-type name="HTML" enabled="true" />
<content-type name="XHTML" enabled="true" />
<content-type name="Java" enabled="true" />
<content-type name="SQL" enabled="true" />
<content-type name="PL/SQL" enabled="true" />
<content-type name="JSON" enabled="true" />
<content-type name="JSON5" enabled="true" />
<content-type name="Groovy" enabled="true" />
<content-type name="AIDL" enabled="true" />
<content-type name="YAML" enabled="true" />
<content-type name="Manifest" enabled="true" />
</content-types>
</qualified-text-editor>
<record-navigation>
<navigation-target value="VIEWER" />
</record-navigation>
</dataset-editor-settings>
<code-editor-settings>
<general>
<show-object-navigation-gutter value="false" />
<show-spec-declaration-navigation-gutter value="true" />
<enable-spellchecking value="true" />
<enable-reference-spellchecking value="false" />
</general>
<confirmations>
<save-changes value="false" />
<revert-changes value="true" />
</confirmations>
</code-editor-settings>
<code-completion-settings>
<filters>
<basic-filter>
<filter-element type="RESERVED_WORD" id="keyword" selected="true" />
<filter-element type="RESERVED_WORD" id="function" selected="true" />
<filter-element type="RESERVED_WORD" id="parameter" selected="true" />
<filter-element type="RESERVED_WORD" id="datatype" selected="true" />
<filter-element type="RESERVED_WORD" id="exception" selected="true" />
<filter-element type="OBJECT" id="schema" selected="true" />
<filter-element type="OBJECT" id="role" selected="true" />
<filter-element type="OBJECT" id="user" selected="true" />
<filter-element type="OBJECT" id="privilege" selected="true" />
<user-schema>
<filter-element type="OBJECT" id="table" selected="true" />
<filter-element type="OBJECT" id="view" selected="true" />
<filter-element type="OBJECT" id="materialized view" selected="true" />
<filter-element type="OBJECT" id="index" selected="true" />
<filter-element type="OBJECT" id="constraint" selected="true" />
<filter-element type="OBJECT" id="trigger" selected="true" />
<filter-element type="OBJECT" id="synonym" selected="false" />
<filter-element type="OBJECT" id="sequence" selected="true" />
<filter-element type="OBJECT" id="procedure" selected="true" />
<filter-element type="OBJECT" id="function" selected="true" />
<filter-element type="OBJECT" id="package" selected="true" />
<filter-element type="OBJECT" id="type" selected="true" />
<filter-element type="OBJECT" id="dimension" selected="true" />
<filter-element type="OBJECT" id="cluster" selected="true" />
<filter-element type="OBJECT" id="dblink" selected="true" />
</user-schema>
<public-schema>
<filter-element type="OBJECT" id="table" selected="false" />
<filter-element type="OBJECT" id="view" selected="false" />
<filter-element type="OBJECT" id="materialized view" selected="false" />
<filter-element type="OBJECT" id="index" selected="false" />
<filter-element type="OBJECT" id="constraint" selected="false" />
<filter-element type="OBJECT" id="trigger" selected="false" />
<filter-element type="OBJECT" id="synonym" selected="false" />
<filter-element type="OBJECT" id="sequence" selected="false" />
<filter-element type="OBJECT" id="procedure" selected="false" />
<filter-element type="OBJECT" id="function" selected="false" />
<filter-element type="OBJECT" id="package" selected="false" />
<filter-element type="OBJECT" id="type" selected="false" />
<filter-element type="OBJECT" id="dimension" selected="false" />
<filter-element type="OBJECT" id="cluster" selected="false" />
<filter-element type="OBJECT" id="dblink" selected="false" />
</public-schema>
<any-schema>
<filter-element type="OBJECT" id="table" selected="true" />
<filter-element type="OBJECT" id="view" selected="true" />
<filter-element type="OBJECT" id="materialized view" selected="true" />
<filter-element type="OBJECT" id="index" selected="true" />
<filter-element type="OBJECT" id="constraint" selected="true" />
<filter-element type="OBJECT" id="trigger" selected="true" />
<filter-element type="OBJECT" id="synonym" selected="true" />
<filter-element type="OBJECT" id="sequence" selected="true" />
<filter-element type="OBJECT" id="procedure" selected="true" />
<filter-element type="OBJECT" id="function" selected="true" />
<filter-element type="OBJECT" id="package" selected="true" />
<filter-element type="OBJECT" id="type" selected="true" />
<filter-element type="OBJECT" id="dimension" selected="true" />
<filter-element type="OBJECT" id="cluster" selected="true" />
<filter-element type="OBJECT" id="dblink" selected="true" />
</any-schema>
</basic-filter>
<extended-filter>
<filter-element type="RESERVED_WORD" id="keyword" selected="true" />
<filter-element type="RESERVED_WORD" id="function" selected="true" />
<filter-element type="RESERVED_WORD" id="parameter" selected="true" />
<filter-element type="RESERVED_WORD" id="datatype" selected="true" />
<filter-element type="RESERVED_WORD" id="exception" selected="true" />
<filter-element type="OBJECT" id="schema" selected="true" />
<filter-element type="OBJECT" id="user" selected="true" />
<filter-element type="OBJECT" id="role" selected="true" />
<filter-element type="OBJECT" id="privilege" selected="true" />
<user-schema>
<filter-element type="OBJECT" id="table" selected="true" />
<filter-element type="OBJECT" id="view" selected="true" />
<filter-element type="OBJECT" id="materialized view" selected="true" />
<filter-element type="OBJECT" id="index" selected="true" />
<filter-element type="OBJECT" id="constraint" selected="true" />
<filter-element type="OBJECT" id="trigger" selected="true" />
<filter-element type="OBJECT" id="synonym" selected="true" />
<filter-element type="OBJECT" id="sequence" selected="true" />
<filter-element type="OBJECT" id="procedure" selected="true" />
<filter-element type="OBJECT" id="function" selected="true" />
<filter-element type="OBJECT" id="package" selected="true" />
<filter-element type="OBJECT" id="type" selected="true" />
<filter-element type="OBJECT" id="dimension" selected="true" />
<filter-element type="OBJECT" id="cluster" selected="true" />
<filter-element type="OBJECT" id="dblink" selected="true" />
</user-schema>
<public-schema>
<filter-element type="OBJECT" id="table" selected="true" />
<filter-element type="OBJECT" id="view" selected="true" />
<filter-element type="OBJECT" id="materialized view" selected="true" />
<filter-element type="OBJECT" id="index" selected="true" />
<filter-element type="OBJECT" id="constraint" selected="true" />
<filter-element type="OBJECT" id="trigger" selected="true" />
<filter-element type="OBJECT" id="synonym" selected="true" />
<filter-element type="OBJECT" id="sequence" selected="true" />
<filter-element type="OBJECT" id="procedure" selected="true" />
<filter-element type="OBJECT" id="function" selected="true" />
<filter-element type="OBJECT" id="package" selected="true" />
<filter-element type="OBJECT" id="type" selected="true" />
<filter-element type="OBJECT" id="dimension" selected="true" />
<filter-element type="OBJECT" id="cluster" selected="true" />
<filter-element type="OBJECT" id="dblink" selected="true" />
</public-schema>
<any-schema>
<filter-element type="OBJECT" id="table" selected="true" />
<filter-element type="OBJECT" id="view" selected="true" />
<filter-element type="OBJECT" id="materialized view" selected="true" />
<filter-element type="OBJECT" id="index" selected="true" />
<filter-element type="OBJECT" id="constraint" selected="true" />
<filter-element type="OBJECT" id="trigger" selected="true" />
<filter-element type="OBJECT" id="synonym" selected="true" />
<filter-element type="OBJECT" id="sequence" selected="true" />
<filter-element type="OBJECT" id="procedure" selected="true" />
<filter-element type="OBJECT" id="function" selected="true" />
<filter-element type="OBJECT" id="package" selected="true" />
<filter-element type="OBJECT" id="type" selected="true" />
<filter-element type="OBJECT" id="dimension" selected="true" />
<filter-element type="OBJECT" id="cluster" selected="true" />
<filter-element type="OBJECT" id="dblink" selected="true" />
</any-schema>
</extended-filter>
</filters>
<sorting enabled="true">
<sorting-element type="RESERVED_WORD" id="keyword" />
<sorting-element type="RESERVED_WORD" id="datatype" />
<sorting-element type="OBJECT" id="column" />
<sorting-element type="OBJECT" id="table" />
<sorting-element type="OBJECT" id="view" />
<sorting-element type="OBJECT" id="materialized view" />
<sorting-element type="OBJECT" id="index" />
<sorting-element type="OBJECT" id="constraint" />
<sorting-element type="OBJECT" id="trigger" />
<sorting-element type="OBJECT" id="synonym" />
<sorting-element type="OBJECT" id="sequence" />
<sorting-element type="OBJECT" id="procedure" />
<sorting-element type="OBJECT" id="function" />
<sorting-element type="OBJECT" id="package" />
<sorting-element type="OBJECT" id="type" />
<sorting-element type="OBJECT" id="dimension" />
<sorting-element type="OBJECT" id="cluster" />
<sorting-element type="OBJECT" id="dblink" />
<sorting-element type="OBJECT" id="schema" />
<sorting-element type="OBJECT" id="role" />
<sorting-element type="OBJECT" id="user" />
<sorting-element type="RESERVED_WORD" id="function" />
<sorting-element type="RESERVED_WORD" id="parameter" />
</sorting>
<format>
<enforce-code-style-case value="true" />
</format>
</code-completion-settings>
<execution-engine-settings>
<statement-execution>
<fetch-block-size value="100" />
<execution-timeout value="20" />
<debug-execution-timeout value="600" />
<focus-result value="false" />
<prompt-execution value="false" />
</statement-execution>
<script-execution>
<command-line-interfaces />
<execution-timeout value="300" />
</script-execution>
<method-execution>
<execution-timeout value="30" />
<debug-execution-timeout value="600" />
<parameter-history-size value="10" />
</method-execution>
</execution-engine-settings>
<operation-settings>
<transactions>
<uncommitted-changes>
<on-project-close value="ASK" />
<on-disconnect value="ASK" />
<on-autocommit-toggle value="ASK" />
</uncommitted-changes>
<multiple-uncommitted-changes>
<on-commit value="ASK" />
<on-rollback value="ASK" />
</multiple-uncommitted-changes>
</transactions>
<session-browser>
<disconnect-session value="ASK" />
<kill-session value="ASK" />
<reload-on-filter-change value="false" />
</session-browser>
<compiler>
<compile-type value="KEEP" />
<compile-dependencies value="ASK" />
<always-show-controls value="false" />
</compiler>
<debugger>
<debugger-type value="ASK" />
<use-generic-runners value="true" />
</debugger>
</operation-settings>
<ddl-file-settings>
<extensions>
<mapping file-type-id="VIEW" extensions="vw" />
<mapping file-type-id="TRIGGER" extensions="trg" />
<mapping file-type-id="PROCEDURE" extensions="prc" />
<mapping file-type-id="FUNCTION" extensions="fnc" />
<mapping file-type-id="PACKAGE" extensions="pkg" />
<mapping file-type-id="PACKAGE_SPEC" extensions="pks" />
<mapping file-type-id="PACKAGE_BODY" extensions="pkb" />
<mapping file-type-id="TYPE" extensions="tpe" />
<mapping file-type-id="TYPE_SPEC" extensions="tps" />
<mapping file-type-id="TYPE_BODY" extensions="tpb" />
</extensions>
<general>
<lookup-ddl-files value="true" />
<create-ddl-files value="false" />
<synchronize-ddl-files value="true" />
<use-qualified-names value="false" />
<make-scripts-rerunnable value="true" />
</general>
</ddl-file-settings>
<general-settings>
<regional-settings>
<date-format value="MEDIUM" />
<number-format value="UNGROUPED" />
<locale value="SYSTEM_DEFAULT" />
<use-custom-formats value="false" />
</regional-settings>
<environment>
<environment-types>
<environment-type id="development" name="Development" description="Development environment" color="-2430209/-12296320" readonly-code="false" readonly-data="false" />
<environment-type id="integration" name="Integration" description="Integration environment" color="-2621494/-12163514" readonly-code="true" readonly-data="false" />
<environment-type id="production" name="Production" description="Productive environment" color="-11574/-10271420" readonly-code="true" readonly-data="true" />
<environment-type id="other" name="Other" description="" color="-1576/-10724543" readonly-code="false" readonly-data="false" />
</environment-types>
<visibility-settings>
<connection-tabs value="true" />
<dialog-headers value="true" />
<object-editor-tabs value="true" />
<script-editor-tabs value="false" />
<execution-result-tabs value="true" />
</visibility-settings>
</environment>
</general-settings>
</component>
</project>

@ -0,0 +1,10 @@
<component name="ProjectDictionaryState">
<dictionary name="snow">
<words>
<w>fujian</w>
<w>gson</w>
<w>guangxi</w>
<w>shuyue</w>
</words>
</dictionary>
</component>

@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="GradleMigrationSettings" migrationVersion="1" />
<component name="GradleSettings">
<option name="linkedExternalProjectsSettings">
<GradleProjectSettings>
<option name="testRunner" value="GRADLE" />
<option name="distributionType" value="DEFAULT_WRAPPED" />
<option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="gradleJvm" value="Android Studio default JDK" />
<option name="modules">
<set>
<option value="$PROJECT_DIR$" />
<option value="$PROJECT_DIR$/app" />
</set>
</option>
</GradleProjectSettings>
</option>
</component>
</project>

@ -0,0 +1,35 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="RemoteRepositoriesConfiguration">
<remote-repository>
<option name="id" value="central" />
<option name="name" value="Maven Central repository" />
<option name="url" value="https://repo1.maven.org/maven2" />
</remote-repository>
<remote-repository>
<option name="id" value="jboss.community" />
<option name="name" value="JBoss Community repository" />
<option name="url" value="https://repository.jboss.org/nexus/content/repositories/public/" />
</remote-repository>
<remote-repository>
<option name="id" value="maven" />
<option name="name" value="maven" />
<option name="url" value="https://mirrors.huaweicloud.com/repository/maven/" />
</remote-repository>
<remote-repository>
<option name="id" value="BintrayJCenter" />
<option name="name" value="BintrayJCenter" />
<option name="url" value="https://jcenter.bintray.com/" />
</remote-repository>
<remote-repository>
<option name="id" value="Google" />
<option name="name" value="Google" />
<option name="url" value="https://dl.google.com/dl/android/maven2/" />
</remote-repository>
<remote-repository>
<option name="id" value="maven2" />
<option name="name" value="maven2" />
<option name="url" value="https://jitpack.io" />
</remote-repository>
</component>
</project>

@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="DesignSurface">
<option name="filePathToZoomLevelMap">
<map>
<entry key="..\:/MakeMoney/snack-app-master/app/src/main/res/layout/activity_main.xml" value="0.25" />
<entry key="..\:/MakeMoney/snack-app-master/app/src/main/res/layout/activity_welcome.xml" value="0.3619791666666667" />
<entry key="..\:/MakeMoney/snack-app-master/app/src/main/res/layout/fragment_home.xml" value="0.3170289855072464" />
<entry key="..\:/MakeMoney/snack-app-master/app/src/main/res/layout/fragment_my.xml" value="0.3619791666666667" />
<entry key="..\:/MakeMoney/snack-app-master/app/src/main/res/layout/head_home_image.xml" value="0.3170289855072464" />
</map>
</option>
</component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_11" project-jdk-name="1.8" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/build/classes" />
</component>
<component name="ProjectType">
<option name="id" value="Android" />
</component>
</project>

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</component>
</project>

1
app/.gitignore vendored

@ -0,0 +1 @@
/build

@ -0,0 +1,57 @@
apply plugin: 'com.android.application'
android {
compileSdkVersion 31
buildToolsVersion "30.0.0"
defaultConfig {
applicationId "com.shuyue.snack"
minSdkVersion 21
targetSdkVersion 31
versionCode 2
versionName '1.1'
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
// ButterKnife requires Java 8.
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
dependencies {
implementation fileTree(dir: "libs", include: ["*.jar"])
implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'com.google.android.material:material:1.1.0'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
implementation 'androidx.navigation:navigation-fragment:2.3.0'
implementation 'androidx.navigation:navigation-ui:2.3.0'
implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
implementation 'androidx.mediarouter:mediarouter:1.1.0'
testImplementation 'junit:junit:4.13'
androidTestImplementation 'androidx.test.ext:junit:1.1.1'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
// ButterKnife
implementation 'com.jakewharton:butterknife:10.2.1'
annotationProcessor 'com.jakewharton:butterknife-compiler:10.2.1'
// BaseRecyclerViewAdapterHelper
implementation 'com.github.CymChad:BaseRecyclerViewAdapterHelper:3.0.4'
// CircleImageView
implementation 'de.hdodenhof:circleimageview:3.1.0'
// Gson
implementation 'com.google.code.gson:gson:2.8.6'
}

@ -0,0 +1,21 @@
# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
# proguardFiles setting in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable
# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile

@ -0,0 +1,26 @@
package com.android.jingdong;
import android.content.Context;
import androidx.test.platform.app.InstrumentationRegistry;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
import static org.junit.Assert.*;
/**
* Instrumented test, which will execute on an Android device.
*
* @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
*/
@RunWith(AndroidJUnit4.class)
public class ExampleInstrumentedTest {
@Test
public void useAppContext() {
// Context of the app under test.
Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
assertEquals("com.shuyue.snack", appContext.getPackageName());
}
}

@ -0,0 +1,49 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.android.jingdong">
<uses-permission android:name="android.permission.INTERNET" />
<application
android:name="com.android.jingdong.MyApplication"
android:icon="@mipmap/logo"
android:label="@string/app_name"
android:networkSecurityConfig="@xml/network_security_config"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme"
tools:ignore="AllowBackup"
tools:targetApi="n">
<activity
android:name="com.android.jingdong.activity.OrderActivity"
android:parentActivityName="com.android.jingdong.MainActivity">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="com.android.jingdong.MainActivity" />
</activity>
<activity
android:name="com.android.jingdong.activity.LoginActivity"
android:parentActivityName="com.android.jingdong.MainActivity">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="com.android.jingdong.MainActivity" />
</activity>
<activity
android:name="com.android.jingdong.activity.DetailActivity"
android:theme="@style/Theme.AppCompat.Light.NoActionBar" />
<activity
android:name="com.android.jingdong.activity.WelcomeActivity"
android:theme="@style/Theme.AppCompat.Light.NoActionBar">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name="com.android.jingdong.MainActivity"
android:label="@string/app_name"
android:launchMode="singleTask" />
</application>
</manifest>

@ -0,0 +1,49 @@
package com.android.jingdong;
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import androidx.navigation.NavController;
import androidx.navigation.Navigation;
import androidx.navigation.ui.AppBarConfiguration;
import androidx.navigation.ui.NavigationUI;
import com.google.android.material.bottomnavigation.BottomNavigationView;
import com.android.jingdong.dao.UserDao;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
BottomNavigationView navView = findViewById(R.id.nav_view);
// 将每个菜单ID作为一组ID传递 5.27
// 因为每个菜单都应该被视为顶级路径
AppBarConfiguration appBarConfiguration = new AppBarConfiguration.Builder(
R.id.navigation_home, R.id.navigation_snack, R.id.navigation_place, R.id.navigation_my)
.build();
NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
NavigationUI.setupActionBarWithNavController(this, navController, appBarConfiguration);
NavigationUI.setupWithNavController(navView, navController);
// 检查登录状态
checkLogin();
}
/**
*
*/
private void checkLogin() {
// 检查持久化的数据
if (UserDao.isLogin()) {
// 已登录
MyApplication.isLogin(true);
MyApplication.setUser(UserDao.getUser());
} else {
// 未登录
MyApplication.isLogin(false);
MyApplication.setUser(null);
}
}
}

@ -0,0 +1,73 @@
package com.android.jingdong;
import android.app.Application;
import com.android.jingdong.model.JD;
import com.android.jingdong.model.User;
import com.android.jingdong.utils.Utils;
import java.util.ArrayList;
import java.util.List;
public class MyApplication extends Application {
/**
* Application
*/
private static MyApplication appContext;
/**
*
*/
private static List<JD> cartJDS;
/**
*
*/
private static User user;
/**
*
*/
private static boolean isLogin;
public static MyApplication getInstance() {
return appContext;
}
public static List<JD> getCartTaobaos() {
return cartJDS;
}
public static User getUser() {
return user;
}
public static void setUser(User user) {
MyApplication.user = user;
}
/**
*
*
* @return <tt>true</tt>: , <tt>false</tt>:
*/
public static boolean isLogin() {
return isLogin;
}
public static void isLogin(boolean isLogin) {
MyApplication.isLogin = isLogin;
}
@Override
public void onCreate() {
super.onCreate();
appContext = this;
// 初始化购物车集合
cartJDS = new ArrayList<>();
// 初始化工具类
Utils.init(this);
}
}

@ -0,0 +1,117 @@
package com.android.jingdong.activity;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.os.Build;
import android.os.Bundle;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
import com.android.jingdong.MyApplication;
import com.android.jingdong.R;
import com.android.jingdong.model.JD;
import com.android.jingdong.utils.Tips;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
public class DetailActivity extends AppCompatActivity {
@BindView(R.id.detailImage)
ImageView image;
@BindView(R.id.detailName)
TextView name;
@BindView(R.id.detailPrice)
TextView price;
@BindView(R.id.detailContent)
TextView detail;
@BindView(R.id.detailAddCartBtn)
Button addCart;
@BindView(R.id.detailFavorite)
ImageView favorite;
public static void actionStart(Context context, JD JD) {
Intent intent = new Intent(context, DetailActivity.class);
intent.putExtra("JD", JD);
context.startActivity(intent);
}
@SuppressLint("SetTextI18n")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_detail);
fullScreen(this);
ButterKnife.bind(this);
JD JD = (JD) getIntent().getSerializableExtra("JD");
if (JD != null) {
image.setImageResource(JD.getImage());
name.setText(JD.getName());
price.setText("¥" + JD.getPrice());
detail.setText(JD.getDetail());
addCart.setOnClickListener(v -> {
if (!MyApplication.getCartTaobaos().contains(JD)) {
// 添加到购物车
JD.setCount(1);
MyApplication.getCartTaobaos().add(JD);
Tips.show("已添加" + JD.getName() + "到购物车");
// 关闭Activity
finish();
} else {
Tips.show("已在购物车中,不能重复添加");
}
});
}
}
@OnClick(R.id.detailBack)
void clickBack() {
finish();
}
@OnClick(R.id.detailFavorite)
void clickFavorite() {
favorite.setImageResource(R.drawable.ic_baseline_favorite_24dp);
}
/**
*
*/
private void fullScreen(Activity activity) {
Window window = activity.getWindow();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
View decorView = ((Window) window).getDecorView();
int option = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
decorView.setSystemUiVisibility(option);
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
window.setStatusBarColor(Color.TRANSPARENT);
} else {
WindowManager.LayoutParams attributes = window.getAttributes();
int flagTranslucentStatus = WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS;
attributes.flags |= flagTranslucentStatus;
window.setAttributes(attributes);
}
}
}

@ -0,0 +1,101 @@
package com.android.jingdong.activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.widget.EditText;
import androidx.appcompat.app.AppCompatActivity;
import com.android.jingdong.MyApplication;
import com.android.jingdong.R;
import com.android.jingdong.dao.UserDao;
import com.android.jingdong.data.DataServer;
import com.android.jingdong.model.User;
import com.android.jingdong.utils.Tips;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
public class LoginActivity extends AppCompatActivity {
@BindView(R.id.loginUsernameEdit)
EditText usernameEdit;
@BindView(R.id.loginPasswordEdit)
EditText passwordEdit;
public static void actionStart(Context context) {
Intent intent = new Intent(context, LoginActivity.class);
context.startActivity(intent);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
setTitle("登录");
ButterKnife.bind(this);
// 恢复账号
String username = UserDao.getUsername();
usernameEdit.setText(username);
}
@Override
protected void onStop() {
super.onStop();
finish();
}
/**
*
*/
@OnClick(R.id.loginBtn)
void login() {
String username = usernameEdit.getText().toString();
String password = passwordEdit.getText().toString();
User user = new User(username, password);
User loginUser = checkUserFromAccountList(user);
if (loginUser != null) {
// 登录成功
Tips.show("登录成功");
MyApplication.isLogin(true);
MyApplication.setUser(loginUser);
// 持久化已登录用户数据
UserDao.saveUser(loginUser);
UserDao.isLogin(true);
// 持久化账号,以便退出登录后不用再输入账号
UserDao.saveUsername(username);
// 关闭Activity
finish();
} else {
// 登录失败
Tips.show("登录失败");
passwordEdit.setText("");
}
}
/**
*
*
* @return : , : null
*/
public User checkUserFromAccountList(User u) {
for (User tmp : DataServer.getAccountList()) {
if (tmp.equals(u)) {
return tmp;
}
}
return null;
}
}

@ -0,0 +1,65 @@
package com.android.jingdong.activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.android.jingdong.MyApplication;
import com.android.jingdong.R;
import com.android.jingdong.adaptor.OrderAdapter;
import com.android.jingdong.dao.OrderDao;
import com.android.jingdong.model.Order;
import java.util.List;
import butterknife.BindView;
import butterknife.ButterKnife;
public class OrderActivity extends AppCompatActivity {
@BindView(R.id.orderRecyclerView)
RecyclerView orderRecyclerView;
public static void actionStart(Context context) {
Intent intent = new Intent(context, OrderActivity.class);
context.startActivity(intent);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_order);
setTitle("订单");
ButterKnife.bind(this);
orderRecyclerView.setLayoutManager(new LinearLayoutManager(OrderActivity.this));
initAdapter();
}
/**
*
*/
private void initAdapter() {
// 获取数据库数据
List<Order> orders = OrderDao.findAllByUsername(MyApplication.getUser().getUsername());
OrderAdapter adapter = new OrderAdapter(orders);
// 设置空布局
adapter.setEmptyView(getEmptyView());
orderRecyclerView.setAdapter(adapter);
}
public View getEmptyView() {
return getLayoutInflater().inflate(R.layout.empty_order_view, orderRecyclerView, false);
}
}

@ -0,0 +1,35 @@
package com.android.jingdong.activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import androidx.appcompat.app.AppCompatActivity;
import com.android.jingdong.MainActivity;
import com.android.jingdong.R;
public class WelcomeActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_welcome);
View decorView = getWindow().getDecorView();
// Hide the status bar.
int uiOptions = View.SYSTEM_UI_FLAG_FULLSCREEN;
decorView.setSystemUiVisibility(uiOptions);
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
Intent intent = new Intent(WelcomeActivity.this, MainActivity.class);
startActivity(intent);
finish();
}
}, 800);
}
}

@ -0,0 +1,22 @@
package com.android.jingdong.adaptor;
import com.android.jingdong.model.JD;
import com.chad.library.adapter.base.BaseQuickAdapter;
import com.chad.library.adapter.base.viewholder.BaseViewHolder;
import com.android.jingdong.R;
import org.jetbrains.annotations.NotNull;
import java.util.List;
public class HomeAdapter extends BaseQuickAdapter<JD, BaseViewHolder> {
public HomeAdapter(List<JD> JDS) {
super(R.layout.item_home_snack, JDS);
}
@Override
protected void convert(@NotNull BaseViewHolder baseViewHolder, JD JD) {
baseViewHolder.setImageResource(R.id.homeSnackImage, JD.getImage());
}
}

@ -0,0 +1,28 @@
package com.android.jingdong.adaptor;
import android.annotation.SuppressLint;
import com.chad.library.adapter.base.BaseQuickAdapter;
import com.chad.library.adapter.base.viewholder.BaseViewHolder;
import com.android.jingdong.R;
import com.android.jingdong.model.Order;
import org.jetbrains.annotations.NotNull;
import java.util.List;
public class OrderAdapter extends BaseQuickAdapter<Order, BaseViewHolder> {
public OrderAdapter(List<Order> orders) {
super(R.layout.item_order, orders);
}
@SuppressLint("SimpleDateFormat")
@Override
protected void convert(@NotNull BaseViewHolder baseViewHolder, Order order) {
baseViewHolder.setText(R.id.orderName, order.getName());
baseViewHolder.setImageResource(R.id.orderImage, order.getImage());
baseViewHolder.setText(R.id.orderTime, "下单时间: " + order.getTime());
baseViewHolder.setText(R.id.orderMoney, "总价: ¥" + order.getMoney());
}
}

@ -0,0 +1,28 @@
package com.android.jingdong.adaptor;
import com.chad.library.adapter.base.BaseQuickAdapter;
import com.chad.library.adapter.base.viewholder.BaseViewHolder;
import com.android.jingdong.R;
import com.android.jingdong.model.JD;
import org.jetbrains.annotations.NotNull;
import java.util.List;
/**
*
*/
public class PlaceOrderAdapter extends BaseQuickAdapter<JD, BaseViewHolder> {
public PlaceOrderAdapter(List<JD> JDS) {
super(R.layout.item_place_order, JDS);
}
@Override
protected void convert(@NotNull BaseViewHolder baseViewHolder, JD JD) {
baseViewHolder.setImageResource(R.id.placeOrderImage, JD.getImage())
.setText(R.id.placeOrderName, JD.getName())
.setText(R.id.placeOrderPrice, "¥" + JD.getPrice())
.setText(R.id.orderCountBtn, String.valueOf(JD.getCount()));
}
}

@ -0,0 +1,29 @@
package com.android.jingdong.adaptor;
import com.chad.library.adapter.base.BaseQuickAdapter;
import com.chad.library.adapter.base.viewholder.BaseViewHolder;
import com.android.jingdong.R;
import org.jetbrains.annotations.NotNull;
import java.util.List;
public class TaobaoLeftAdapter extends BaseQuickAdapter<String, BaseViewHolder> {
public TaobaoLeftAdapter(List<String> types) {
super(R.layout.item_taobao_left, types);
}
/**
* item
*/
@Override
protected void convert(@NotNull BaseViewHolder baseViewHolder, String s) {
// 第一个item默认选中状态
// if (baseViewHolder.getLayoutPosition() == 0) {
// baseViewHolder.setBackgroundResource(R.id.snackLeftType, R.color.colorBgWhite);
// }
baseViewHolder.setText(R.id.snackLeftType, s);
}
}

@ -0,0 +1,24 @@
package com.android.jingdong.adaptor;
import com.android.jingdong.model.JD;
import com.chad.library.adapter.base.BaseQuickAdapter;
import com.chad.library.adapter.base.viewholder.BaseViewHolder;
import com.android.jingdong.R;
import org.jetbrains.annotations.NotNull;
import java.util.List;
public class TaobaoRightAdapter extends BaseQuickAdapter<JD, BaseViewHolder> {
public TaobaoRightAdapter(List<JD> JDS) {
super(R.layout.item_taobao_right, JDS);
}
@Override
protected void convert(@NotNull BaseViewHolder baseViewHolder, JD JD) {
baseViewHolder.setImageResource(R.id.snackRightImage, JD.getImage())
.setText(R.id.snackRightName, JD.getName())
.setText(R.id.snackRightPrice, "¥" + JD.getPrice());
}
}

@ -0,0 +1,29 @@
package com.android.jingdong.animator;
import android.animation.Animator;
import android.animation.ObjectAnimator;
import android.view.View;
import android.view.animation.DecelerateInterpolator;
import com.chad.library.adapter.base.animation.BaseAnimation;
import org.jetbrains.annotations.NotNull;
public class MyAnimation implements BaseAnimation {
@NotNull
@Override
public Animator[] animators(@NotNull View view) {
Animator scaleY = ObjectAnimator.ofFloat(view, "scaleY", 1.3f, 1);
Animator scaleX = ObjectAnimator.ofFloat(view, "scaleX", 1.3f, 1);
Animator alpha = ObjectAnimator.ofFloat(view, "alpha", 0, 1f);
scaleY.setDuration(350);
scaleX.setDuration(350);
alpha.setDuration(350);
scaleY.setInterpolator(new DecelerateInterpolator());
scaleX.setInterpolator(new DecelerateInterpolator());
return new Animator[]{scaleY, scaleX, alpha};
}
}

@ -0,0 +1,37 @@
package com.android.jingdong.animator;
import android.animation.Animator;
import android.animation.ObjectAnimator;
import android.view.View;
import android.view.animation.Interpolator;
import com.chad.library.adapter.base.animation.BaseAnimation;
import org.jetbrains.annotations.NotNull;
import static java.lang.Math.PI;
import static java.lang.Math.pow;
import static java.lang.Math.sin;
public class MyAnimation2 implements BaseAnimation {
static class MyInterpolator2 implements Interpolator {
@Override
public float getInterpolation(float input) {
float factor = 0.7f;
return (float) (pow(2.0, -10.0 * input) * sin((input - factor / 4) * (2 * PI) / factor) + 1);
}
}
@NotNull
@Override
public Animator[] animators(@NotNull View view) {
Animator translationX =
ObjectAnimator.ofFloat(view, "translationX", -view.getRootView().getWidth(), 0f);
translationX.setDuration(800);
translationX.setInterpolator(new MyInterpolator2());
return new Animator[]{translationX};
}
}

@ -0,0 +1,27 @@
package com.android.jingdong.animator;
import android.animation.Animator;
import android.animation.ObjectAnimator;
import android.view.View;
import android.view.animation.DecelerateInterpolator;
import com.chad.library.adapter.base.animation.BaseAnimation;
import org.jetbrains.annotations.NotNull;
public class MyAnimation3 implements BaseAnimation {
@NotNull
@Override
public Animator[] animators(@NotNull View view) {
Animator alpha = ObjectAnimator.ofFloat(view, "alpha", 0, 1f);
alpha.setDuration(450);
Animator translationY =
ObjectAnimator.ofFloat(view, "translationY", view.getRootView().getHeight(), 0f);
translationY.setDuration(450);
translationY.setInterpolator(new DecelerateInterpolator(1.2f));
return new Animator[]{alpha, translationY};
}
}

@ -0,0 +1,33 @@
package com.android.jingdong.dao;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import androidx.annotation.Nullable;
public class DatabaseHelper extends SQLiteOpenHelper {
public DatabaseHelper(@Nullable Context context, int version) {
super(context, " ", null, version);
}
@Override
public void onCreate(SQLiteDatabase db) {
// 创建数据库
String createOrders = "create table orders (" +
"id integer primary key autoincrement," +
"name text," +
"image integer," +
"money real," +
"time text," +
"username text)";
db.execSQL(createOrders);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}

@ -0,0 +1,62 @@
package com.android.jingdong.dao;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import com.android.jingdong.model.Order;
import com.android.jingdong.utils.Utils;
import java.util.ArrayList;
import java.util.List;
public class OrderDao {
private static DatabaseHelper dbHelper = new DatabaseHelper(Utils.getContext(), 1);
static {
dbHelper.getWritableDatabase();
}
/**
*
*/
public static void saveOrder(List<Order> orders) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
for (Order order : orders) {
ContentValues values = new ContentValues();
values.put("name", order.getName());
values.put("image", order.getImage());
values.put("money", order.getMoney());
values.put("time", order.getTime());
values.put("username", order.getUsername());
db.insert("orders", null, values);
}
}
/**
*
*/
public static List<Order> findAllByUsername(String username) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
List<Order> orders = new ArrayList<>();
// 查询指定用户名订单
Cursor cursor = db.query("orders", null, "username=?", new String[]{username}, null, null, "time desc");
if (cursor.moveToFirst()) {
do {
String name = cursor.getString(cursor.getColumnIndex("name"));
int image = cursor.getInt(cursor.getColumnIndex("image"));
double money = cursor.getDouble(cursor.getColumnIndex("money"));
String time = cursor.getString(cursor.getColumnIndex("time"));
Order order = new Order(name, image, money, time);
orders.add(order);
} while (cursor.moveToNext());
}
cursor.close();
return orders;
}
}

@ -0,0 +1,71 @@
package com.android.jingdong.dao;
import android.content.Context;
import android.content.SharedPreferences;
import com.google.gson.Gson;
import com.android.jingdong.model.User;
import com.android.jingdong.utils.Utils;
public class UserDao {
// 实例化SharedPreferences对象
private static SharedPreferences data = Utils.getContext().getSharedPreferences("data", Context.MODE_PRIVATE);
// Gson对象
private static Gson gson = new Gson();
public static boolean isLogin() {
return data.getBoolean("isLogin", false);
}
public static void isLogin(boolean bool) {
SharedPreferences.Editor edit = data.edit();
edit.putBoolean("isLogin", bool);
edit.apply();
}
/**
*
*/
public static User getUser() {
String userJson = data.getString("user", "");
return gson.fromJson(userJson, User.class);
}
public static void saveUser(User user) {
String userJson = gson.toJson(user);
SharedPreferences.Editor edit = data.edit();
edit.putString("user", userJson);
edit.apply();
}
/**
*
*/
public static void removeUserAndLoginStatus() {
SharedPreferences.Editor edit = data.edit();
edit.remove("user");
edit.remove("isLogin");
edit.apply();
}
public static void removeAll() {
SharedPreferences.Editor edit = data.edit();
edit.clear();
edit.apply();
}
/**
*
*/
public static void saveUsername(String username) {
SharedPreferences.Editor editor = data.edit();
editor.putString("username", username);
editor.apply();
}
public static String getUsername() {
return data.getString("username", "");
}
}

@ -0,0 +1,156 @@
package com.android.jingdong.data;
import android.annotation.SuppressLint;
import com.android.jingdong.model.JD;
import com.android.jingdong.model.Order;
import com.android.jingdong.R;
import com.android.jingdong.model.User;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
public class DataServer {
private static List<String> snackOrderList;
private static List<JD> homeList;
private static List<JD> fujianList;
private static List<JD> guangxiList;
private static List<JD> guangzhouList;
private static List<JD> beijingList;
private static List<JD> chongqingList;
private static List<User> accountList;
/**
*
*/
public static List<JD> getHomeList() {
if (homeList == null) {
homeList = new ArrayList<JD>() {{
add(new JD("苹果13", 5999, R.mipmap.sp1, "苹果13一般指iPhone 13。 iPhone 13是美国苹果公司于北京时间2021年9月15日凌晨1点在Apple Park发布的iPhone手机。"));
add(new JD("华为mate40", 5888, R.mipmap.sp2, "华为Mate40一般指HUAWEI Mate 40。 HUAWEI Mate 40是华为公司于2020年10月22日发布的手机于2020年12月21日上市。"));
add(new JD("联想Y9000P", 8999, R.mipmap.sp3, "联想Y9000P采用了双面金属设计搭载16英寸四边窄边框屏2560*1600 分辨率165Hz刷新率500nit亮度100%sRGB色域HDR400认证支持杜比视界。"));
add(new JD("暗影精灵8", 8699, R.mipmap.sp4, "暗影精灵8 Plus搭载全新i7处理器全系标配DDR5 4800MHz双通道内存还有游戏级PCle 4.0 SSD加持游戏载入少等待、尽情存储少焦虑。"));
add(new JD("海盗船K100", 1299, R.mipmap.sp5, "海盗船K100键盘采用的是悬浮式按键设计搭配高品质精密二色注塑PBT透光键帽1.5mm的厚度超耐用,防滑性能很好,使用手感非常赞。"));
add(new JD("罗技G502", 229, R.mipmap.sp6, "罗技G502游戏鼠标在配重平衡及追踪表面的适应性需要有更好的提升尽可能满足每一位玩家的精确需求。"));
}};
}
return homeList;
}
/**
*
*/
public static List<String> getSnackOrderList() {
if (snackOrderList == null) {
snackOrderList = new ArrayList<String>() {{
add("手机");
add("电脑");
add("电子配件");
// add("鼠标");
// add("耳机");
}};
}
return snackOrderList;
}
/**
*
*/
public static List<JD> getFujianList() {
if (fujianList == null) {
fujianList = new ArrayList<JD>() {{
add(new JD("苹果13", 5999, R.mipmap.sp1, "苹果13一般指iPhone 13。 iPhone 13是美国苹果公司于北京时间2021年9月15日凌晨1点在Apple Park发布的iPhone手机。"));
add(new JD("华为mate40", 5888, R.mipmap.sp2, "华为Mate40一般指HUAWEI Mate 40。 HUAWEI Mate 40是华为公司于2020年10月22日发布的手机于2020年12月21日上市。"));
}};
}
return fujianList;
}
/**
*
*/
public static List<JD> getGuangxiList() {
if (guangxiList == null) {
guangxiList = new ArrayList<JD>() {{
add(new JD("联想Y9000P", 8999, R.mipmap.sp3, "联想Y9000P采用了双面金属设计搭载16英寸四边窄边框屏2560*1600 分辨率165Hz刷新率500nit亮度100%sRGB色域HDR400认证支持杜比视界。"));
add(new JD("暗影精灵8", 8699, R.mipmap.sp4, "暗影精灵8 Plus搭载全新i7处理器全系标配DDR5 4800MHz双通道内存还有游戏级PCle 4.0 SSD加持游戏载入少等待、尽情存储少焦虑。"));
}};
}
return guangxiList;
}
/**
*
*/
public static List<JD> getGuangzhouList() {
if (guangzhouList == null) {
guangzhouList = new ArrayList<JD>() {{
add(new JD("海盗船K100", 1299, R.mipmap.sp5, "海盗船K100键盘采用的是悬浮式按键设计搭配高品质精密二色注塑PBT透光键帽1.5mm的厚度超耐用,防滑性能很好,使用手感非常赞。"));
add(new JD("罗技G502", 229, R.mipmap.sp6, "罗技G502游戏鼠标在配重平衡及追踪表面的适应性需要有更好的提升尽可能满足每一位玩家的精确需求。"));
}};
}
return guangzhouList;
}
// /**
// * 鼠标
// */
// public static List<JD> getBeijingList() {
// if (beijingList == null) {
// beijingList = new ArrayList<JD>() {{
//
// }};
// }
// return beijingList;
// }
//
// /**
// * 耳机
// */
// public static List<JD> getChongqingList() {
// if (chongqingList == null) {
// chongqingList = new ArrayList<JD>() {{
//
// }};
// }
// return chongqingList;
// }
/**
*
*/
public static List<User> getAccountList() {
if (accountList == null) {
accountList = new ArrayList<User>() {{
add(new User("123456", "123", "小新", R.drawable.one4));
}};
}
return accountList;
}
public static List<Order> getOrderTest() {
@SuppressLint("SimpleDateFormat") SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
return new ArrayList<Order>() {{
add(new Order("是我", R.mipmap.user1_head, 10.9, simpleDateFormat.format(new Date())));
add(new Order("是我", R.mipmap.user1_head, 10.9, simpleDateFormat.format(new Date())));
add(new Order("是我", R.mipmap.user1_head, 10.9, simpleDateFormat.format(new Date())));
}};
}
}

@ -0,0 +1,121 @@
package com.android.jingdong.model;
import org.jetbrains.annotations.NotNull;
import java.io.Serializable;
import java.util.Objects;
/**
*
*/
public class JD implements Serializable {
private static final long serialVersionUID = 1L;
/**
*
*/
private String name;
/**
*
*/
private double price;
/**
*
*/
private int image;
/**
*
*/
private String detail;
/**
*
*/
private int count;
public JD() {
}
public JD(String name, double price, int image, String detail) {
this.name = name;
this.price = price;
this.image = image;
this.detail = detail;
this.count = 1;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public int getImage() {
return image;
}
public void setImage(int image) {
this.image = image;
}
public String getDetail() {
return detail;
}
public void setDetail(String detail) {
this.detail = detail;
}
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
/**
* equals
*
* @param o
* @return
*/
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
JD JD = (JD) o;
return Objects.equals(name, JD.name);
}
@Override
public int hashCode() {
return Objects.hash(name);
}
@NotNull
@Override
public String toString() {
return "JD{" +
"name='" + name + '\'' +
", price=" + price +
", image=" + image +
", detail='" + detail + '\'' +
", count=" + count +
'}';
}
}

@ -0,0 +1,104 @@
package com.android.jingdong.model;
import android.annotation.SuppressLint;
import org.jetbrains.annotations.NotNull;
import java.io.Serializable;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Order implements Serializable {
private static final long serialVersionUID = 1L;
private String name;
private int image;
private double money;
private String time;
private String username;
public Order() {
}
public Order(String name, int image, double money, String time) {
this.name = name;
this.image = image;
this.money = money;
this.time = time;
}
/**
*
*
*
* @param JD
*/
@SuppressLint("SimpleDateFormat")
public Order(JD JD) {
this.name = JD.getName();
this.image = JD.getImage();
// 计算金额
BigDecimal money = BigDecimal.valueOf(JD.getPrice()).multiply(BigDecimal.valueOf(JD.getCount()));
this.money = money.doubleValue();
// 订单产生时间(格式化)
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
this.time = simpleDateFormat.format(new Date());
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getImage() {
return image;
}
public void setImage(int image) {
this.image = image;
}
public double getMoney() {
return money;
}
public void setMoney(double money) {
this.money = money;
}
public String getTime() {
return time;
}
public void setTime(String time) {
this.time = time;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
@NotNull
@Override
public String toString() {
return "Order{" +
"name='" + name + '\'' +
", image='" + image + '\'' +
", money=" + money +
", time=" + time +
'}';
}
}

@ -0,0 +1,108 @@
package com.android.jingdong.model;
import org.jetbrains.annotations.NotNull;
import java.io.Serializable;
import java.util.Objects;
public class User implements Serializable {
private static final long serialVersionUID = 1L;
private int id;
private String username;
private String password;
private String nickname;
private int headImage;
public User() {
}
public User(String username, String password) {
this.username = username;
this.password = password;
}
public User(String username, String password, String nickname, int headImage) {
this.username = username;
this.password = password;
this.nickname = nickname;
this.headImage = headImage;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getNickname() {
return nickname;
}
public void setNickname(String nickname) {
this.nickname = nickname;
}
public int getHeadImage() {
return headImage;
}
public void setHeadImage(int headImage) {
this.headImage = headImage;
}
/**
*
*
* @param o
* @return
*/
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
User user = (User) o;
return Objects.equals(username, user.username) &&
Objects.equals(password, user.password);
}
@Override
public int hashCode() {
return Objects.hash(username, password);
}
@NotNull
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
", nickname='" + nickname + '\'' +
", headImage='" + headImage + '\'' +
'}';
}
}

@ -0,0 +1,171 @@
package com.android.jingdong.ui.JD;
import android.annotation.SuppressLint;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.ViewModelProviders;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.android.jingdong.model.JD;
import com.chad.library.adapter.base.BaseQuickAdapter;
import com.chad.library.adapter.base.listener.OnItemClickListener;
import com.android.jingdong.MyApplication;
import com.android.jingdong.R;
import com.android.jingdong.activity.DetailActivity;
import com.android.jingdong.adaptor.TaobaoLeftAdapter;
import com.android.jingdong.adaptor.TaobaoRightAdapter;
import com.android.jingdong.data.DataServer;
import com.android.jingdong.utils.Tips;
import java.util.Objects;
import butterknife.BindView;
import butterknife.ButterKnife;
public class TaobaoFragment extends Fragment {
private TaobaoViewModel taobaoViewModel;
// 乐器页面左边列表已选择的Position
private int leftSelectPosition = 0;
@BindView(R.id.snackLeftRecyclerView)
RecyclerView leftRecyclerview;
@BindView(R.id.snackRightRecyclerView)
RecyclerView rightRecyclerView;
// 右边适配器
private TaobaoRightAdapter rightAdapter;
public static TaobaoFragment newInstance() {
return new TaobaoFragment();
}
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
taobaoViewModel = ViewModelProviders.of(this).get(TaobaoViewModel.class);
View root = inflater.inflate(R.layout.fragment_snack, container, false);
// 绑定资源
ButterKnife.bind(this, root);
return root;
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
leftRecyclerview.setLayoutManager(new LinearLayoutManager(getActivity()));
rightRecyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
initLeftAdapter();
initRightAdapter();
}
/**
*
*/
@SuppressLint("ResourceAsColor")
private void initLeftAdapter() {
// 实例化左边适配器对象
TaobaoLeftAdapter leftAdapter = new TaobaoLeftAdapter(DataServer.getSnackOrderList());
// 设置动画效果
leftAdapter.setAnimationEnable(true);
leftAdapter.setAnimationFirstOnly(false);
leftAdapter.setAnimationWithDefault(BaseQuickAdapter.AnimationType.SlideInLeft);
// 触发点击按钮
leftAdapter.setOnItemClickListener((adapter, view, position) -> {
if (position != leftSelectPosition) {
String item = (String) adapter.getItem(position);
// 原本选中的item变成未选中颜色
Objects.requireNonNull(adapter.getViewByPosition(leftSelectPosition, R.id.snackLeftType)).setBackgroundResource(R.color.colorContent);
// 当前item变成选中颜色
Objects.requireNonNull(adapter.getViewByPosition(position, R.id.snackLeftType)).setBackgroundResource(R.color.colorBgWhite);
leftSelectPosition = position;
// 刷新右边列表
// rightAdapter.setAnimationWithDefault(BaseQuickAdapter.AnimationType.SlideInBottom);
rightAdapter.setAnimationEnable(false);
switch (position) {
case 1:
rightAdapter.setNewInstance(DataServer.getGuangxiList());
break;
case 2:
rightAdapter.setNewInstance(DataServer.getGuangzhouList());
break;
case 3:
// rightAdapter.setNewInstance(DataServer.getBeijingList());
break;
case 4:
// rightAdapter.setNewInstance(DataServer.getChongqingList());
break;
default:
rightAdapter.setNewInstance(DataServer.getFujianList());
break;
}
}
});
// 设置左边列表适配器
leftRecyclerview.setAdapter(leftAdapter);
}
/**
*
*/
public void initRightAdapter() {
// 实例化右边适配器对象
rightAdapter = new TaobaoRightAdapter(DataServer.getFujianList());
// 设置动画效果
rightAdapter.setAnimationEnable(true);
// rightAdapter.setAnimationFirstOnly(false);
rightAdapter.setAnimationWithDefault(BaseQuickAdapter.AnimationType.SlideInRight);
// 设置尾部
rightAdapter.addFooterView(getFooterView());
// 点击item事件
rightAdapter.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(@NonNull BaseQuickAdapter<?, ?> adapter, @NonNull View view, int position) {
JD JD = (JD) adapter.getItem(position);
DetailActivity.actionStart(getContext(), JD);
}
});
// 左边列表加入购物车点击事件
rightAdapter.addChildClickViewIds(R.id.snackRightAddBtn);
rightAdapter.setOnItemChildClickListener((adapter, view, position) -> {
JD JD = (JD) adapter.getItem(position);
if (view.getId() == R.id.snackRightAddBtn) {
if (!MyApplication.getCartTaobaos().contains(JD)) {
// 添加到购物车
JD.setCount(1);
MyApplication.getCartTaobaos().add(JD);
Tips.show("已添加" + JD.getName() + "到购物车");
} else {
Tips.show("已在购物车中,不能重复添加");
}
}
});
// 设置右边列表适配器
rightRecyclerView.setAdapter(rightAdapter);
}
/**
* RecyclerViewView
*/
private View getFooterView() {
return getLayoutInflater().inflate(R.layout.footer_no_item, rightRecyclerView, false);
}
}

@ -0,0 +1,19 @@
package com.android.jingdong.ui.JD;
import androidx.lifecycle.LiveData;
import androidx.lifecycle.MediatorLiveData;
import androidx.lifecycle.ViewModel;
public class TaobaoViewModel extends ViewModel {
private MediatorLiveData<String> mText;
public TaobaoViewModel() {
mText = new MediatorLiveData<>();
mText.setValue("点单页面");
}
public LiveData<String> getText() {
return mText;
}
}

@ -0,0 +1,88 @@
package com.android.jingdong.ui.home;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.ViewModelProviders;
import androidx.recyclerview.widget.RecyclerView;
import androidx.recyclerview.widget.StaggeredGridLayoutManager;
import com.android.jingdong.R;
import com.android.jingdong.activity.DetailActivity;
import com.android.jingdong.adaptor.HomeAdapter;
import com.android.jingdong.animator.MyAnimation3;
import com.android.jingdong.data.DataServer;
import com.android.jingdong.model.JD;
import butterknife.BindView;
import butterknife.ButterKnife;
public class HomeFragment extends Fragment {
private HomeViewModel homeViewModel;
@BindView(R.id.homeRecyclerView)
RecyclerView homeRecyclerView;
public View onCreateView(@NonNull LayoutInflater inflater,
ViewGroup container, Bundle savedInstanceState) {
homeViewModel =
ViewModelProviders.of(this).get(HomeViewModel.class);
View root = inflater.inflate(R.layout.fragment_home, container, false);
// 绑定资源
ButterKnife.bind(this, root);
return root;
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
// 首页瀑布流列表
homeRecyclerView.setLayoutManager(new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL));
initHomeAdapter();
}
private void initHomeAdapter() {
// 实例化购物车列表适配器对象
HomeAdapter adapter = new HomeAdapter(DataServer.getHomeList());
// 设置动画效果
adapter.setAnimationEnable(true);
// adapter.setAnimationFirstOnly(false);
// adapter.setAnimationWithDefault(BaseQuickAdapter.AnimationType.SlideInBottom);
adapter.setAdapterAnimation(new MyAnimation3());
// 设置头部
adapter.setHeaderView(getHeadView(), 1);
// 设置尾部
adapter.setFooterView(getFooterView(), 1);
// 点击事件监听器
adapter.setOnItemClickListener((adapter1, view, position) -> {
JD JD = (JD) adapter1.getItem(position);
DetailActivity.actionStart(getContext(), JD);
});
// 设置适配器
homeRecyclerView.setAdapter(adapter);
}
/**
* RecyclerViewView
*/
private View getHeadView() {
return getLayoutInflater().inflate(R.layout.head_home_image, homeRecyclerView, false);
}
/**
* RecyclerViewView
*/
private View getFooterView() {
return getLayoutInflater().inflate(R.layout.footer_no_item, homeRecyclerView, false);
}
}

@ -0,0 +1,19 @@
package com.android.jingdong.ui.home;
import androidx.lifecycle.LiveData;
import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.ViewModel;
public class HomeViewModel extends ViewModel {
private MutableLiveData<String> mText;
public HomeViewModel() {
mText = new MutableLiveData<>();
mText.setValue("首页页面");
}
public LiveData<String> getText() {
return mText;
}
}

@ -0,0 +1,196 @@
package com.android.jingdong.ui.my;
import android.annotation.SuppressLint;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.ViewModelProviders;
import com.android.jingdong.MyApplication;
import com.android.jingdong.R;
import com.android.jingdong.activity.LoginActivity;
import com.android.jingdong.activity.OrderActivity;
import com.android.jingdong.dao.UserDao;
import com.android.jingdong.model.User;
import com.android.jingdong.utils.Tips;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
import de.hdodenhof.circleimageview.CircleImageView;
public class MyFragment extends Fragment {
private MyViewModel myViewModel;
@BindView(R.id.myUserHead)
CircleImageView image;
@BindView(R.id.constraintLayout)
ConstraintLayout constraintLayout;
@BindView(R.id.myUserNickName)
TextView nickname;
@BindView(R.id.myUserName)
TextView username;
@BindView(R.id.myModifyView)
LinearLayout modifyView;
@BindView(R.id.myGeneralView)
LinearLayout generalView;
public View onCreateView(@NonNull LayoutInflater inflater,
ViewGroup container, Bundle savedInstanceState) {
myViewModel =
ViewModelProviders.of(this).get(MyViewModel.class);
View root = inflater.inflate(R.layout.fragment_my, container, false);
// 绑定资源
ButterKnife.bind(this, root);
return root;
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
initView();
}
@Override
public void onResume() {
super.onResume();
initView();
}
@SuppressLint("SetTextI18n")
private void initView() {
if (MyApplication.isLogin()) {
User user = MyApplication.getUser();
image.setImageResource(user.getHeadImage());
nickname.setText(user.getNickname());
username.setText("账号: " + user.getUsername());
}
}
@OnClick(R.id.myUserHead)
void clickImage() {
if (MyApplication.isLogin()) {
Tips.show("已登录");
} else {
LoginActivity.actionStart(getActivity());
}
}
@OnClick(R.id.constraintLayout)
void clickcslayout() {
if (MyApplication.isLogin()) {
Tips.show("已登录");
} else {
LoginActivity.actionStart(getActivity());
}
}
/**
*
*/
@OnClick(R.id.myOrderView)
void clickOrder() {
if (MyApplication.isLogin()) {
OrderActivity.actionStart(getContext());
} else {
Tips.show("请先登录");
}
}
@OnClick(R.id.myModifyText)
void clickShowModify() {
if (modifyView.getVisibility() == View.GONE) {
modifyView.setVisibility(View.VISIBLE);
} else {
modifyView.setVisibility(View.GONE);
}
}
@OnClick(R.id.myGeneralText)
void clickShowGeneral() {
if (generalView.getVisibility() == View.GONE) {
generalView.setVisibility(View.VISIBLE);
} else {
generalView.setVisibility(View.GONE);
}
}
@OnClick(R.id.myModifyBtn)
void clickModifySubmit() {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setTitle("提示")
.setMessage("是否保存地址信息")
.setPositiveButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
})
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
modifyView.setVisibility(View.GONE);
}
})
.create()
.show();
}
@OnClick(R.id.myGeneralBtn)
void clickGeneralSubmit() {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setTitle("提示")
.setMessage("是否保存通用设置")
.setPositiveButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
})
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
generalView.setVisibility(View.GONE);
}
})
.create()
.show();
}
/**
* 退
*/
@OnClick(R.id.logoutBtn)
void clickLogout() {
if (MyApplication.isLogin()) {
// 清除持久化数据
UserDao.removeUserAndLoginStatus();
// 清除全局数据
MyApplication.isLogin(false);
MyApplication.setUser(null);
nickname.setText("未登录");
username.setText("");
image.setImageResource(R.mipmap.logo);
} else {
Tips.show("还没有登录,请先登录");
}
}
}

@ -0,0 +1,19 @@
package com.android.jingdong.ui.my;
import androidx.lifecycle.LiveData;
import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.ViewModel;
public class MyViewModel extends ViewModel {
private MutableLiveData<String> mText;
public MyViewModel() {
mText = new MutableLiveData<>();
mText.setValue("我的页面");
}
public LiveData<String> getText() {
return mText;
}
}

@ -0,0 +1,248 @@
package com.android.jingdong.ui.place;
import android.annotation.SuppressLint;
import android.app.AlertDialog;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.ViewModelProviders;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.android.jingdong.model.JD;
import com.chad.library.adapter.base.BaseQuickAdapter;
import com.chad.library.adapter.base.listener.OnItemClickListener;
import com.android.jingdong.MyApplication;
import com.android.jingdong.R;
import com.android.jingdong.activity.DetailActivity;
import com.android.jingdong.adaptor.PlaceOrderAdapter;
import com.android.jingdong.dao.OrderDao;
import com.android.jingdong.model.Order;
import com.android.jingdong.utils.Tips;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
public class PlaceFragment extends Fragment {
private PlaceViewModel placeViewModel;
@BindView(R.id.placeRecyclerView)
RecyclerView orderRecyclerView;
@BindView(R.id.placeBuyBtn)
Button buyButton;
@BindView(R.id.placeMoney)
TextView placeMoney;
PlaceOrderAdapter orderAdapter;
public View onCreateView(@NonNull LayoutInflater inflater,
ViewGroup container, Bundle savedInstanceState) {
placeViewModel =
ViewModelProviders.of(this).get(PlaceViewModel.class);
View root = inflater.inflate(R.layout.fragment_place, container, false);
// 绑定资源
ButterKnife.bind(this, root);
// final TextView textView = root.findViewById(R.id.text_notifications);
// notificationsViewModel.getText().observe(getViewLifecycleOwner(), new Observer<String>() {
// @Override
// public void onChanged(@Nullable String s) {
// textView.setText(s);
// }
// });
return root;
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
orderRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
initOrderAdapter();
}
@Override
public void onResume() {
super.onResume();
// 每次页面显示都计算合计金额
calcTotalMoney();
}
/**
*
*/
private void initOrderAdapter() {
// 实例化购物车列表适配器对象
orderAdapter = new PlaceOrderAdapter(MyApplication.getCartTaobaos());
// 设置空布局
orderAdapter.setEmptyView(getEmptyView());
// 设置动画效果
orderAdapter.setAnimationEnable(true);
// orderAdapter.setAnimationFirstOnly(false);
orderAdapter.setAnimationWithDefault(BaseQuickAdapter.AnimationType.ScaleIn);
// 点击item事件触发
orderAdapter.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(@NonNull BaseQuickAdapter<?, ?> adapter, @NonNull View view, int position) {
JD JD = (JD) adapter.getItem(position);
DetailActivity.actionStart(getContext(), JD);
}
});
// 注册item内子控件id
orderAdapter.addChildClickViewIds(R.id.orderLessLabel, R.id.orderAddLabel);
// 子控件点击监听
orderAdapter.setOnItemChildClickListener((adapter, view, position) -> {
JD JD = (JD) adapter.getItem(position);
switch (view.getId()) {
case R.id.orderLessLabel:
// 点击减少数量
if (JD.getCount() == 1) {
MyApplication.getCartTaobaos().remove(position);
} else {
MyApplication.getCartTaobaos().get(position).setCount(JD.getCount() - 1);
}
adapter.notifyDataSetChanged();
break;
case R.id.orderAddLabel:
// 点击添加数量
MyApplication.getCartTaobaos().get(position).setCount(JD.getCount() + 1);
adapter.notifyDataSetChanged();
break;
default:
break;
}
calcTotalMoney();
});
// 设置适配器
orderRecyclerView.setAdapter(orderAdapter);
}
/**
*
*/
@OnClick(R.id.placeBuyBtn)
void initClick() {
if (MyApplication.getCartTaobaos().isEmpty()) {
Tips.show("购物车是空的啦!!!");
} else {
if (MyApplication.isLogin()) {
// 显示Dialog
showDialog();
} else {
Tips.show("请先登录");
}
}
}
/**
*
*/
@SuppressLint("InflateParams")
public void showDialog() {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
LayoutInflater inflater = requireActivity().getLayoutInflater();
builder.setView(inflater.inflate(R.layout.dialog_view, null))
.setTitle("备注")
.setPositiveButton("下单", (dialog, which) -> {
// 持久化订单数据
saveOrder();
// 清空购物车数据
MyApplication.getCartTaobaos().removeAll(MyApplication.getCartTaobaos());
// 通知适配器数据变化
orderAdapter.notifyDataSetChanged();
// 刷新总金额
calcTotalMoney();
Tips.show("下单成功");
})
.create()
.show();
}
/**
*
*/
public void saveOrder() {
List<Order> orders = new ArrayList<>();
// 购物车数据产生订单
for (JD JD : MyApplication.getCartTaobaos()) {
Order order = new Order(JD);
order.setUsername(MyApplication.getUser().getUsername());
orders.add(order);
}
OrderDao.saveOrder(orders);
}
/**
*
*/
@OnClick(R.id.deleteOrder)
void deleteOrder() {
if (MyApplication.getCartTaobaos().isEmpty()) {
Tips.show("购物车是空的");
} else {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setTitle("提示")
.setMessage("是否清空购物车?")
.setPositiveButton("确定", (dialog, which) -> {
// 清空购物车数据
MyApplication.getCartTaobaos().removeAll(MyApplication.getCartTaobaos());
// 通知适配器数据变化
orderAdapter.notifyDataSetChanged();
// 刷新总金额
calcTotalMoney();
Tips.show("已清空购物车");
})
.create()
.show();
}
}
// 计算合计金额
@SuppressLint("SetTextI18n")
private void calcTotalMoney() {
BigDecimal totalMoney = BigDecimal.valueOf(0);
// 遍历计算总金额(解决舍入误差)
if (!MyApplication.getCartTaobaos().isEmpty()) {
for (JD JD : MyApplication.getCartTaobaos()) {
// 乐器单价 × 乐器数量
BigDecimal tmp = BigDecimal.valueOf(JD.getPrice()).multiply(BigDecimal.valueOf(JD.getCount()));
totalMoney = totalMoney.add(tmp);
}
}
placeMoney.setText("¥" + totalMoney.doubleValue());
}
/**
*
*/
private View getEmptyView() {
return getLayoutInflater().inflate(R.layout.empty_cart_view, orderRecyclerView, false);
}
}

@ -0,0 +1,19 @@
package com.android.jingdong.ui.place;
import androidx.lifecycle.LiveData;
import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.ViewModel;
public class PlaceViewModel extends ViewModel {
private MutableLiveData<String> mText;
public PlaceViewModel() {
mText = new MutableLiveData<>();
mText.setValue("下单页面");
}
public LiveData<String> getText() {
return mText;
}
}

@ -0,0 +1,84 @@
package com.android.jingdong.utils;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.drawable.ShapeDrawable;
import android.graphics.drawable.shapes.RoundRectShape;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.TextView;
import android.widget.Toast;
public class Tips {
/**
* Toast
*
* @param message
*/
public static void show(String message) {
show(message, Toast.LENGTH_SHORT);
}
/**
* Toast
*
* @param message
* @param duration
*/
public static void show(String message, int duration) {
Toast toast = new Toast(Utils.getContext());
toast.setDuration(duration);
toast.setGravity(Gravity.CENTER, 0, 0);
toast.setView(createToastView(message));
toast.show();
}
/**
* ToastView
*
* @param message
* @return View
*/
private static View createToastView(String message) {
// 构建圆角矩形背景
float radius = dp2px(6);
RoundRectShape shape = new RoundRectShape(new float[]{radius, radius, radius, radius, radius, radius, radius, radius}, null, null);
ShapeDrawable drawable = new ShapeDrawable(shape);
drawable.getPaint().setColor(Color.argb(225, 240, 240, 240));
drawable.getPaint().setStyle(Paint.Style.FILL);
drawable.getPaint().setAntiAlias(true);
drawable.getPaint().setFlags(Paint.ANTI_ALIAS_FLAG);
// 创建View
FrameLayout layout = new FrameLayout(Utils.getContext());
ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
layout.setLayoutParams(layoutParams);
layout.setPadding(dp2px(16), dp2px(12), dp2px(16), dp2px(12));
layout.setBackground(drawable);
TextView textView = new TextView(Utils.getContext());
textView.setLayoutParams(new FrameLayout.LayoutParams(FrameLayout.LayoutParams.WRAP_CONTENT, FrameLayout.LayoutParams.WRAP_CONTENT));
textView.setTextSize(15);
textView.setText(message);
textView.setLineSpacing(dp2px(4), 1f);
textView.setTextColor(Color.BLACK);
layout.addView(textView);
return layout;
}
/**
* dppx
*
* @param dp dp
* @return px
*/
private static int dp2px(float dp) {
final float scale = Utils.getContext().getResources().getDisplayMetrics().density;
return (int) (dp * scale + 0.5f);
}
}

@ -0,0 +1,35 @@
package com.android.jingdong.utils;
import android.annotation.SuppressLint;
import android.content.Context;
public class Utils {
@SuppressLint("StaticFieldLeak")
private static Context context;
private Utils() {
throw new UnsupportedOperationException("我是需要实例化的啦!!!");
}
/**
*
*
* @param context
*/
public static void init(Context context) {
Utils.context = context.getApplicationContext();
}
/**
* ApplicationContext
*
* @return ApplicationContext
*/
public static Context getContext() {
if (context != null) {
return context;
}
throw new NullPointerException("上下文为空啊!!!");
}
}

@ -0,0 +1,30 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:aapt="http://schemas.android.com/aapt"
android:width="108dp"
android:height="108dp"
android:viewportWidth="108"
android:viewportHeight="108">
<path android:pathData="M31,63.928c0,0 6.4,-11 12.1,-13.1c7.2,-2.6 26,-1.4 26,-1.4l38.1,38.1L107,108.928l-32,-1L31,63.928z">
<aapt:attr name="android:fillColor">
<gradient
android:endX="85.84757"
android:endY="92.4963"
android:startX="42.9492"
android:startY="49.59793"
android:type="linear">
<item
android:color="#44000000"
android:offset="0.0" />
<item
android:color="#00000000"
android:offset="1.0" />
</gradient>
</aapt:attr>
</path>
<path
android:fillColor="#FFFFFF"
android:fillType="nonZero"
android:pathData="M65.3,45.828l3.8,-6.6c0.2,-0.4 0.1,-0.9 -0.3,-1.1c-0.4,-0.2 -0.9,-0.1 -1.1,0.3l-3.9,6.7c-6.3,-2.8 -13.4,-2.8 -19.7,0l-3.9,-6.7c-0.2,-0.4 -0.7,-0.5 -1.1,-0.3C38.8,38.328 38.7,38.828 38.9,39.228l3.8,6.6C36.2,49.428 31.7,56.028 31,63.928h46C76.3,56.028 71.8,49.428 65.3,45.828zM43.4,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2c-0.3,-0.7 -0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C45.3,56.528 44.5,57.328 43.4,57.328L43.4,57.328zM64.6,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2s-0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C66.5,56.528 65.6,57.328 64.6,57.328L64.6,57.328z"
android:strokeWidth="1"
android:strokeColor="#00000000" />
</vector>

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#4D000000" />
<corners android:radius="10dp" />
</shape>

Binary file not shown.

After

Width:  |  Height:  |  Size: 221 KiB

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="@color/colorBgWhite" />
<corners
android:bottomLeftRadius="12dp"
android:bottomRightRadius="12dp" />
</shape>

@ -0,0 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="?attr/colorControlNormal">
<path
android:fillColor="@android:color/white"
android:pathData="M19,3h-4.18C14.4,1.84 13.3,1 12,1c-1.3,0 -2.4,0.84 -2.82,2L5,3c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2L21,5c0,-1.1 -0.9,-2 -2,-2zM12,3c0.55,0 1,0.45 1,1s-0.45,1 -1,1 -1,-0.45 -1,-1 0.45,-1 1,-1zM14,17L7,17v-2h7v2zM17,13L7,13v-2h10v2zM17,9L7,9L7,7h10v2z"/>
</vector>

@ -0,0 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="?attr/colorControlNormal">
<path
android:fillColor="@android:color/white"
android:pathData="M19,3h-4.18C14.4,1.84 13.3,1 12,1c-1.3,0 -2.4,0.84 -2.82,2L5,3c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2L21,5c0,-1.1 -0.9,-2 -2,-2zM12,3c0.55,0 1,0.45 1,1s-0.45,1 -1,1 -1,-0.45 -1,-1 0.45,-1 1,-1zM10,17l-4,-4 1.41,-1.41L10,14.17l6.59,-6.59L18,9l-8,8z"/>
</vector>

@ -0,0 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="?attr/colorControlNormal">
<path
android:fillColor="@android:color/white"
android:pathData="M6,19c0,1.1 0.9,2 2,2h8c1.1,0 2,-0.9 2,-2V7H6v12zM19,4h-3.5l-1,-1h-5l-1,1H5v2h14V4z"/>
</vector>

@ -0,0 +1,5 @@
<vector android:height="24dp" android:tint="#F56C6C"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M12,21.35l-1.45,-1.32C5.4,15.36 2,12.28 2,8.5 2,5.42 4.42,3 7.5,3c1.74,0 3.41,0.81 4.5,2.09C13.09,3.81 14.76,3 16.5,3 19.58,3 22,5.42 22,8.5c0,3.78 -3.4,6.86 -8.55,11.54L12,21.35z"/>
</vector>

@ -0,0 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="?attr/colorControlNormal">
<path
android:fillColor="@android:color/white"
android:pathData="M16.5,3c-1.74,0 -3.41,0.81 -4.5,2.09C10.91,3.81 9.24,3 7.5,3 4.42,3 2,5.42 2,8.5c0,3.78 3.4,6.86 8.55,11.54L12,21.35l1.45,-1.32C18.6,15.36 22,12.28 22,8.5 22,5.42 19.58,3 16.5,3zM12.1,18.55l-0.1,0.1 -0.1,-0.1C7.14,14.24 4,11.39 4,8.5 4,6.5 5.5,5 7.5,5c1.54,0 3.04,0.99 3.57,2.36h1.87C13.46,5.99 14.96,5 16.5,5c2,0 3.5,1.5 3.5,3.5 0,2.89 -3.14,5.74 -7.9,10.05z"/>
</vector>

@ -0,0 +1,5 @@
<vector android:height="24dp" android:tint="#FFFFFF"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M15.41,7.41L14,6l-6,6 6,6 1.41,-1.41L10.83,12z"/>
</vector>

@ -0,0 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="?attr/colorControlNormal">
<path
android:fillColor="@android:color/white"
android:pathData="M21,6h-2v9L6,15v2c0,0.55 0.45,1 1,1h11l4,4L22,7c0,-0.55 -0.45,-1 -1,-1zM17,12L17,3c0,-0.55 -0.45,-1 -1,-1L3,2c-0.55,0 -1,0.45 -1,1v14l4,-4h10c0.55,0 1,-0.45 1,-1z"/>
</vector>

@ -0,0 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="?attr/colorControlNormal">
<path
android:fillColor="@android:color/white"
android:pathData="M15.73,3L8.27,3L3,8.27v7.46L8.27,21h7.46L21,15.73L21,8.27L15.73,3zM12,17.3c-0.72,0 -1.3,-0.58 -1.3,-1.3 0,-0.72 0.58,-1.3 1.3,-1.3 0.72,0 1.3,0.58 1.3,1.3 0,0.72 -0.58,1.3 -1.3,1.3zM13,13h-2L11,7h2v6z"/>
</vector>

@ -0,0 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="?attr/colorControlNormal">
<path
android:fillColor="@android:color/white"
android:pathData="M7,18c-1.1,0 -1.99,0.9 -1.99,2S5.9,22 7,22s2,-0.9 2,-2 -0.9,-2 -2,-2zM1,2v2h2l3.6,7.59 -1.35,2.45c-0.16,0.28 -0.25,0.61 -0.25,0.96 0,1.1 0.9,2 2,2h12v-2L7.42,15c-0.14,0 -0.25,-0.11 -0.25,-0.25l0.03,-0.12 0.9,-1.63h7.45c0.75,0 1.41,-0.41 1.75,-1.03l3.58,-6.49c0.08,-0.14 0.12,-0.31 0.12,-0.48 0,-0.55 -0.45,-1 -1,-1L5.21,4l-0.94,-2L1,2zM17,18c-1.1,0 -1.99,0.9 -1.99,2s0.89,2 1.99,2 2,-0.9 2,-2 -0.9,-2 -2,-2z"/>
</vector>

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="200.97656dp"
android:height="200dp"
android:viewportWidth="1029"
android:viewportHeight="1024">
<path
android:fillColor="#FF000000"
android:pathData="M1001.42,494.59q21.5,20.48 22.53,45.06t-16.38,40.96q-19.46,17.41 -45.06,16.38t-40.96,-14.34q-5.12,-4.1 -31.23,-28.67t-62.46,-58.88 -77.82,-73.73 -78.34,-74.24 -63.49,-60.42 -33.79,-31.74q-32.77,-29.7 -64.51,-28.67t-62.46,28.67q-10.24,9.22 -38.4,35.33t-65.02,60.93 -77.82,72.7 -75.78,70.66 -59.9,55.81 -30.21,27.14q-15.36,12.29 -40.96,13.31t-44.03,-15.36q-20.48,-18.43 -19.46,-44.54t17.41,-41.47q6.14,-6.14 37.89,-35.84t75.78,-70.66 94.72,-88.06 94.21,-88.06 74.75,-70.14 36.35,-34.3q38.91,-37.89 83.97,-38.4t76.8,30.21q6.14,5.12 25.6,24.06t47.62,46.08 62.98,60.93 70.66,68.1 70.14,68.1 62.98,60.93 48.13,46.59zM447.44,346.11q25.6,-23.55 61.44,-25.09t64.51,25.09q3.07,3.07 18.43,17.41l38.91,35.84q22.53,21.5 50.69,48.13t57.86,53.25q68.61,63.49 153.6,142.34l0,194.56q0,22.53 -16.9,39.94t-45.57,18.43l-193.54,0 0,-158.72q0,-33.79 -31.74,-33.79l-195.58,0q-17.41,0 -24.06,10.24t-6.66,23.55q0,6.14 -0.51,31.23t-0.51,53.76l0,73.73 -187.39,0q-29.7,0 -47.1,-13.31t-17.41,-37.89l0,-203.78q83.97,-76.8 152.58,-139.26 28.67,-26.62 57.34,-52.74t52.22,-47.62 39.42,-36.35 19.97,-18.94z"/>
</vector>

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="200dp"
android:height="200dp"
android:viewportWidth="1024"
android:viewportHeight="1024">
<path
android:fillColor="#FF000000"
android:pathData="M925.5,957.6l-7,-189.6 -21.4,-577.2c-0.6,-17.2 -14.8,-30.8 -32,-30.8L738.3,160c-6.8,0 -12.8,-4.3 -15.1,-10.8 -11.2,-31.7 -29.4,-60.2 -52.8,-83.6C629.9,25.1 573.9,0 512,0c-97.5,0 -180.5,62.3 -211.2,149.3 -2.3,6.4 -8.3,10.8 -15.1,10.8L158.8,160.1c-17.2,0 -31.3,13.6 -32,30.8L105.5,768l-7,189.6c-1.3,36.3 27.7,66.4 63.9,66.4h699.2c36.3,0 65.3,-30.1 63.9,-66.4zM368,154.3c7.8,-16.2 18.3,-30.8 30.9,-43.4 29,-29 69,-46.9 113.1,-46.9 63.4,0 118.2,36.8 144.1,90.3 1.3,2.7 -0.7,5.7 -3.6,5.7L371.6,160c-3,0 -4.9,-3.1 -3.6,-5.7zM189.1,239.4c0.3,-8.6 7.4,-15.4 16,-15.4L280,224c4.4,0 8,3.6 8,8v120c0,8.8 3.6,16.8 9.4,22.6 6,5.9 14.2,9.6 23.4,9.4 17.5,-0.4 31.3,-15.1 31.3,-32.6L352.1,232c0,-4.4 3.6,-8 8,-8h304c4.4,0 8,3.6 8,8v120c0,8.8 3.6,16.8 9.4,22.6 6,5.9 14.2,9.6 23.4,9.4 17.5,-0.4 31.3,-15.1 31.3,-32.6L736.2,232c0,-4.4 3.6,-8 8,-8h74.9c8.6,0 15.7,6.8 16,15.4l19.4,524.4c0.1,2.3 -1.7,4.2 -4,4.2L173.7,768c-2.3,0 -4.1,-1.9 -4,-4.2l19.4,-524.4z"/>
</vector>

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="200.78125dp"
android:height="200dp"
android:viewportWidth="1028"
android:viewportHeight="1024">
<path
android:fillColor="#FF000000"
android:pathData="M332.8,790.53q19.46,0 36.86,7.17t30.21,19.97 20.48,30.21 7.68,36.86 -7.68,36.86 -20.48,30.21 -30.21,20.48 -36.86,7.68q-20.48,0 -37.89,-7.68t-30.21,-20.48 -20.48,-30.21 -7.68,-36.86 7.68,-36.86 20.48,-30.21 30.21,-19.97 37.89,-7.17zM758.78,792.58q19.46,0 37.38,7.17t30.72,19.97 20.48,30.21 7.68,36.86 -7.68,36.86 -20.48,30.21 -30.72,20.48 -37.38,7.68 -36.86,-7.68 -30.21,-20.48 -20.48,-30.21 -7.68,-36.86 7.68,-36.86 20.48,-30.21 30.21,-19.97 36.86,-7.17zM930.82,210.94q28.67,0 44.54,7.68t22.53,18.94 6.14,24.06 -3.58,22.02 -13.31,37.89 -22.02,62.98 -23.55,68.1 -18.94,53.25q-13.31,40.96 -33.28,56.83t-49.66,15.87l-35.84,0 -65.54,0 -86.02,0 -96.26,0 -253.95,0 14.34,92.16 517.12,0q49.15,0 49.15,41.98 0,20.48 -9.73,35.84t-38.4,14.34l-49.15,0 -94.21,0 -118.78,0 -119.81,0 -99.33,0 -55.3,0q-20.48,0 -34.3,-9.22t-23.04,-24.06 -14.85,-32.26 -8.7,-32.77q-1.02,-6.14 -5.63,-29.7t-11.26,-58.88 -14.85,-78.85 -16.38,-87.55q-19.46,-103.42 -44.03,-230.4l-76.8,0q-15.36,0 -25.6,-7.68t-16.9,-18.43 -9.22,-23.04 -2.56,-22.53q0,-20.48 13.82,-33.79t37.38,-12.29l103.42,0q20.48,0 32.77,6.14t19.46,15.36 10.24,18.94 5.12,16.9q2.05,8.19 4.1,23.04t4.1,30.21q3.07,18.43 6.14,38.91l700.42,0zM892.93,302.08l-641.02,-2.05 35.84,185.34 535.55,1.02z"/>
</vector>

@ -0,0 +1,12 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="200dp"
android:height="200dp"
android:viewportWidth="1024"
android:viewportHeight="1024">
<path
android:fillColor="#FF000000"
android:pathData="M761.6,633.6c-64,57.6 -147.2,96 -243.2,96 -96,0 -179.2,-38.4 -249.6,-96C108.8,716.8 0,825.6 0,1024l1024,0C1024,825.6 915.2,723.2 761.6,633.6z"/>
<path
android:fillColor="#FF000000"
android:pathData="M512,652.8c160,0 288,-134.4 288,-294.4 0,-160 -128,-294.4 -288,-294.4S224,198.4 224,358.4C224,524.8 358.4,652.8 512,652.8z"/>
</vector>

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
android:fillColor="#FF000000"
android:pathData="M10,20v-6h4v6h5v-8h3L12,3 2,12h3v8z"/>
</vector>

@ -0,0 +1,170 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="108dp"
android:height="108dp"
android:viewportWidth="108"
android:viewportHeight="108">
<path
android:fillColor="#3DDC84"
android:pathData="M0,0h108v108h-108z" />
<path
android:fillColor="#00000000"
android:pathData="M9,0L9,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,0L19,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M29,0L29,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M39,0L39,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M49,0L49,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M59,0L59,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M69,0L69,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M79,0L79,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M89,0L89,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M99,0L99,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,9L108,9"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,19L108,19"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,29L108,29"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,39L108,39"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,49L108,49"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,59L108,59"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,69L108,69"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,79L108,79"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,89L108,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,99L108,99"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,29L89,29"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,39L89,39"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,49L89,49"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,59L89,59"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,69L89,69"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,79L89,79"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M29,19L29,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M39,19L39,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M49,19L49,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M59,19L59,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M69,19L69,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M79,19L79,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
</vector>

@ -0,0 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="?attr/colorControlNormal">
<path
android:fillColor="@android:color/white"
android:pathData="M12,12c2.21,0 4,-1.79 4,-4s-1.79,-4 -4,-4 -4,1.79 -4,4 1.79,4 4,4zM12,14c-2.67,0 -8,1.34 -8,4v2h16v-2c0,-2.66 -5.33,-4 -8,-4z"/>
</vector>

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
android:fillColor="#FF000000"
android:pathData="M15.5,14h-0.79l-0.28,-0.27C15.41,12.59 16,11.11 16,9.5 16,5.91 13.09,3 9.5,3S3,5.91 3,9.5 5.91,16 9.5,16c1.61,0 3.09,-0.59 4.23,-1.57l0.27,0.28v0.79l5,4.99L20.49,19l-4.99,-5zM9.5,14C7.01,14 5,11.99 5,9.5S7.01,5 9.5,5 14,7.01 14,9.5 11.99,14 9.5,14z"/>
</vector>

@ -0,0 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="?attr/colorControlNormal">
<path
android:fillColor="@android:color/white"
android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM13.41,18.09L13.41,20h-2.67v-1.93c-1.71,-0.36 -3.16,-1.46 -3.27,-3.4h1.96c0.1,1.05 0.82,1.87 2.65,1.87 1.96,0 2.4,-0.98 2.4,-1.59 0,-0.83 -0.44,-1.61 -2.67,-2.14 -2.48,-0.6 -4.18,-1.62 -4.18,-3.67 0,-1.72 1.39,-2.84 3.11,-3.21L10.74,4h2.67v1.95c1.86,0.45 2.79,1.86 2.85,3.39L14.3,9.34c-0.05,-1.11 -0.64,-1.87 -2.22,-1.87 -1.5,0 -2.4,0.68 -2.4,1.64 0,0.84 0.65,1.39 2.67,1.91s4.18,1.39 4.18,3.91c-0.01,1.83 -1.38,2.83 -3.12,3.16z"/>
</vector>

@ -0,0 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="?attr/colorControlNormal">
<path
android:fillColor="@android:color/white"
android:pathData="M8.1,13.34l2.83,-2.83L3.91,3.5c-1.56,1.56 -1.56,4.09 0,5.66l4.19,4.18zM14.88,11.53c1.53,0.71 3.68,0.21 5.27,-1.38 1.91,-1.91 2.28,-4.65 0.81,-6.12 -1.46,-1.46 -4.2,-1.1 -6.12,0.81 -1.59,1.59 -2.09,3.74 -1.38,5.27L3.7,19.87l1.41,1.41L12,14.41l6.88,6.88 1.41,-1.41L13.41,13l1.47,-1.47z"/>
</vector>

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 168 KiB

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#1A409EFF" />
<corners android:bottomLeftRadius="12sp" android:bottomRightRadius="12sp"/>
</shape>

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#F56" />
<corners android:radius="50dp" />
</shape>

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_selected="false" />
</selector>

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#fff" />
<corners android:radius="16dp" />
</shape>

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="@color/colorBgWhite"/>
<corners android:radius="12dp"/>
</shape>

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="@color/colorContent" />
<corners android:radius="14sp" />
</shape>

@ -0,0 +1,132 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/colorContent"
android:fitsSystemWindows="false"
tools:context=".activity.DetailActivity">
<ScrollView
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/detailImage"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:adjustViewBounds="true"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@mipmap/sp1" />
<ImageView
android:id="@+id/detailBack"
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_marginStart="16dp"
android:layout_marginTop="42dp"
android:background="@drawable/back_bg"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/ic_baseline_navigate_before_24dp" />
</androidx.constraintlayout.widget.ConstraintLayout>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginBottom="15sp"
android:background="@drawable/detail_info">
<TextView
android:id="@+id/detailName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="24dp"
android:layout_marginTop="20dp"
android:text="TextView"
android:textSize="24sp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/detailPrice"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="24dp"
android:layout_marginTop="12dp"
android:layout_marginBottom="20dp"
android:text="TextView"
android:textColor="#F56C6C"
android:textSize="20sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/detailName" />
<ImageView
android:id="@+id/detailFavorite"
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_marginTop="20dp"
android:layout_marginEnd="24dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/ic_baseline_favorite_border_24dp" />
</androidx.constraintlayout.widget.ConstraintLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="15dp"
android:background="@drawable/radius_content"
android:orientation="vertical"
android:padding="24sp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="10sp"
android:gravity="center_vertical"
android:text="详情"
android:textSize="24sp" />
<TextView
android:id="@+id/detailContent"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="内容"
android:textSize="20sp" />
</LinearLayout>
</LinearLayout>
</ScrollView>
<Button
android:id="@+id/detailAddCartBtn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="32dp"
android:layout_marginBottom="32dp"
android:padding="8sp"
android:text="添加到购物车"
android:textSize="20sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

@ -0,0 +1,64 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".activity.LoginActivity">
<de.hdodenhof.circleimageview.CircleImageView
android:layout_width="96dp"
android:layout_height="96dp"
android:src="@drawable/jd"
app:layout_constraintBottom_toTopOf="@+id/guideline2"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<EditText
android:id="@+id/loginUsernameEdit"
style="@android:style/Widget.Material.Light.AutoCompleteTextView"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="48dp"
android:layout_marginEnd="48dp"
android:autofillHints=""
android:ems="10"
android:hint="@string/login_username_edit"
android:inputType="textPersonName"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@+id/guideline2" />
<EditText
android:id="@+id/loginPasswordEdit"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="48dp"
android:layout_marginTop="32dp"
android:layout_marginEnd="48dp"
android:autofillHints=""
android:ems="10"
android:hint="@string/login_password_edit"
android:inputType="textPassword"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/loginUsernameEdit" />
<Button
android:id="@+id/loginBtn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="32dp"
android:text="@string/login_btn"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/loginPasswordEdit" />
<androidx.constraintlayout.widget.Guideline
android:id="@+id/guideline2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
app:layout_constraintGuide_percent="0.25" />
</androidx.constraintlayout.widget.ConstraintLayout>

@ -0,0 +1,33 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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/container"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.google.android.material.bottomnavigation.BottomNavigationView
android:id="@+id/nav_view"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:background="?android:attr/windowBackground"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:menu="@menu/bottom_nav_menu" />
<fragment
android:id="@+id/nav_host_fragment"
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="0dp"
android:layout_height="0dp"
app:defaultNavHost="true"
app:layout_constraintBottom_toTopOf="@+id/nav_view"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:navGraph="@navigation/mobile_navigation"
tools:ignore="FragmentTagUsage" />
</androidx.constraintlayout.widget.ConstraintLayout>

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".activity.OrderActivity">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/orderRecyclerView"
android:layout_width="0dp"
android:layout_height="0dp"
android:background="@color/colorContent"
android:overScrollMode="never"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

@ -0,0 +1,40 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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/activityWelcome"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="false"
android:background="@color/colorBgWhite"
tools:context=".activity.WelcomeActivity">
<ImageView
android:id="@+id/imageView"
android:layout_width="0dp"
android:layout_height="0dp"
android:scaleType="centerCrop"
app:layout_constraintBottom_toTopOf="@+id/guideline"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@mipmap/jingdong" />
<androidx.constraintlayout.widget.Guideline
android:id="@+id/guideline"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
app:layout_constraintGuide_percent="0.85" />
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="淘宝"
android:textSize="30dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/imageView" />
</androidx.constraintlayout.widget.ConstraintLayout>

@ -0,0 +1,17 @@
<?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="wrap_content"
android:orientation="vertical">
<EditText
android:id="@+id/editTextTextPersonName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="22sp"
android:layout_marginTop="12sp"
android:layout_marginRight="22sp"
android:ems="10"
android:hint="@string/remarks_edit"
android:inputType="textPersonName" />
</LinearLayout>

@ -0,0 +1,33 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<ImageView
android:layout_width="35dp"
android:layout_height="35dp"
android:layout_weight="1"
app:srcCompat="@drawable/ic_cart_black_24dp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="35dp"
android:layout_weight="1"
android:paddingStart="8sp"
android:gravity="center_vertical"
android:text="@string/cart_empty_label"
android:textSize="18sp"
tools:ignore="RtlSymmetry" />
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

@ -0,0 +1,33 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<ImageView
android:layout_width="35dp"
android:layout_height="35dp"
android:layout_weight="1"
app:srcCompat="@drawable/ic_baseline_assignment_24dp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="35dp"
android:layout_weight="1"
android:gravity="center_vertical"
android:paddingStart="8sp"
android:text="@string/order_empty_label"
android:textSize="18sp"
tools:ignore="RtlSymmetry" />
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

@ -0,0 +1,14 @@
<?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="48dp"
android:layout_marginTop="8dp"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:text="@string/footer_label"
android:textColor="#C0C4CC" />
</LinearLayout>

@ -0,0 +1,21 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".ui.home.HomeFragment">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/homeRecyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/colorContent"
android:overScrollMode="never"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

@ -0,0 +1,440 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/colorContent"
tools:context=".ui.my.MyFragment">
<ScrollView
android:layout_width="0dp"
android:layout_height="0dp"
android:overScrollMode="never"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/constraintLayout"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:background="@drawable/detail_info"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:ignore="MissingConstraints">
<de.hdodenhof.circleimageview.CircleImageView
android:id="@+id/myUserHead"
android:layout_width="80dp"
android:layout_height="80dp"
android:layout_marginStart="16dp"
android:layout_marginTop="24dp"
android:layout_marginBottom="24dp"
android:src="@drawable/jd"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/myUserNickName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="17dp"
android:layout_marginTop="24dp"
android:text="未登录"
android:textSize="22sp"
app:layout_constraintStart_toEndOf="@+id/myUserHead"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/myUserName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="17dp"
android:layout_marginTop="8dp"
android:text=""
android:textSize="18sp"
app:layout_constraintStart_toEndOf="@+id/myUserHead"
app:layout_constraintTop_toBottomOf="@+id/myUserNickName" />
</androidx.constraintlayout.widget.ConstraintLayout>
<LinearLayout
android:id="@+id/linearLayout"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:background="@drawable/radius_content"
android:orientation="horizontal"
android:padding="10sp"
android:weightSum="4"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/constraintLayout">
<LinearLayout
android:id="@+id/myOrderView"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:orientation="vertical">
<ImageView
android:layout_width="match_parent"
android:layout_height="55dp"
android:padding="8dp"
android:src="@drawable/ic_baseline_assignment_24dp" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:text="我的订单" />
</LinearLayout>
<LinearLayout
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:orientation="vertical">
<ImageView
android:layout_width="match_parent"
android:layout_height="55dp"
android:padding="8dp"
android:src="@drawable/ic_sharp_monetization_on_24dp" />
<TextView
android:id="@+id/textView4"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:text="待付款" />
</LinearLayout>
<LinearLayout
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:orientation="vertical">
<ImageView
android:layout_width="match_parent"
android:layout_height="55dp"
android:padding="8dp"
android:src="@drawable/ic_baseline_question_answer_24dp" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:text="待评价" />
</LinearLayout>
<LinearLayout
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:orientation="vertical">
<ImageView
android:layout_width="match_parent"
android:layout_height="55dp"
android:padding="8dp"
android:src="@drawable/ic_baseline_report_24dp" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:text="退款" />
</LinearLayout>
</LinearLayout>
<LinearLayout
android:id="@+id/linearLayout2"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="1dp"
android:layout_marginTop="16dp"
android:background="@drawable/radius_content"
android:orientation="vertical"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/linearLayout">
<TextView
android:layout_width="match_parent"
android:layout_height="45dp"
android:gravity="center_vertical"
android:paddingStart="16dp"
android:text="支付设置"
android:textSize="18sp"
tools:ignore="RtlSymmetry" />
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="#EEEEEE" />
<TextView
android:id="@+id/myModifyText"
android:layout_width="match_parent"
android:layout_height="45dp"
android:gravity="center_vertical"
android:paddingStart="16dp"
android:text="修改地址"
android:textSize="18sp"
tools:ignore="RtlSymmetry" />
<LinearLayout
android:id="@+id/myModifyView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#1A409EFF"
android:orientation="vertical"
android:visibility="gone">
<EditText
android:id="@+id/editTextTextPersonName2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="32sp"
android:layout_marginTop="22sp"
android:layout_marginRight="32sp"
android:layout_marginBottom="12sp"
android:ems="10"
android:hint="请输入新的手机号码"
android:inputType="textPersonName" />
<EditText
android:id="@+id/editTextTextPersonName3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="32sp"
android:layout_marginTop="12sp"
android:layout_marginRight="32sp"
android:layout_marginBottom="12sp"
android:ems="10"
android:hint="请输入新的收货地址"
android:inputType="textPersonName" />
<Button
android:id="@+id/myModifyBtn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end"
android:layout_marginEnd="32sp"
android:layout_marginBottom="12sp"
android:text="确定" />
</LinearLayout>
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="#EEEEEE" />
<TextView
android:id="@+id/myGeneralText"
android:layout_width="match_parent"
android:layout_height="45dp"
android:gravity="center_vertical"
android:paddingStart="16dp"
android:text="通用"
android:textSize="18sp"
tools:ignore="RtlSymmetry" />
<LinearLayout
android:id="@+id/myGeneralView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/my_general_setting"
android:orientation="vertical"
android:visibility="gone">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<CheckBox
android:id="@+id/checkBox"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="24dp"
android:text="不要葱"
android:visibility="gone"
app:layout_constraintStart_toStartOf="@+id/guideline3"
app:layout_constraintTop_toTopOf="parent" />
<CheckBox
android:id="@+id/checkBox2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:text="不要香菜"
android:visibility="gone"
app:layout_constraintStart_toStartOf="@+id/guideline3"
app:layout_constraintTop_toBottomOf="@+id/checkBox" />
<CheckBox
android:id="@+id/checkBox4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:text="不要蒜"
android:visibility="gone"
app:layout_constraintStart_toStartOf="@+id/guideline3"
app:layout_constraintTop_toBottomOf="@+id/checkBox2" />
<CheckBox
android:id="@+id/checkBox5"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:text="不要动物油"
android:visibility="gone"
app:layout_constraintStart_toStartOf="@+id/guideline3"
app:layout_constraintTop_toBottomOf="@+id/checkBox4" />
<CheckBox
android:id="@+id/checkBox6"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:layout_marginBottom="12dp"
android:text="不要肉"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="@+id/guideline3"
app:layout_constraintTop_toBottomOf="@+id/checkBox5" />
<RadioGroup
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="24dp"
app:layout_constraintEnd_toStartOf="@+id/guideline4"
app:layout_constraintTop_toTopOf="parent">
<RadioButton
android:id="@+id/radioButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="8sp"
android:text="不辣"
android:visibility="gone"
/>
<RadioButton
android:id="@+id/radioButton2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="8sp"
android:visibility="gone"
android:text="微辣" />
<RadioButton
android:id="@+id/radioButton3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="8sp"
android:text="中辣"
android:visibility="gone"
/>
<RadioButton
android:id="@+id/radioButton4"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="8sp"
android:text="特辣"
android:visibility="gone"
/>
<RadioButton
android:id="@+id/radioButton5"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="麻辣"
android:visibility="gone"
/>
</RadioGroup>
<androidx.constraintlayout.widget.Guideline
android:id="@+id/guideline3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_percent="0.15" />
<androidx.constraintlayout.widget.Guideline
android:id="@+id/guideline4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_percent="0.8" />
</androidx.constraintlayout.widget.ConstraintLayout>
<Button
android:id="@+id/myGeneralBtn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end"
android:layout_marginEnd="32sp"
android:layout_marginBottom="12sp"
android:text="确定" />
</LinearLayout>
</LinearLayout>
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:layout_marginBottom="16dp"
android:background="@drawable/radius_content"
android:orientation="vertical"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/linearLayout2">
<TextView
android:id="@+id/logoutBtn"
android:layout_width="match_parent"
android:layout_height="45dp"
android:gravity="center"
android:paddingStart="16dp"
android:text="退出账号"
android:textSize="16sp"
tools:ignore="RtlSymmetry" />
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
</ScrollView>
</androidx.constraintlayout.widget.ConstraintLayout>

@ -0,0 +1,60 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".ui.place.PlaceFragment">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/placeRecyclerView"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:background="@color/colorContent"
android:overScrollMode="never" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="60dp"
android:background="@color/colorBgWhite"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_marginStart="12dp"
android:gravity="center"
android:text="@string/place_money_label"
android:textSize="20sp" />
<TextView
android:id="@+id/placeMoney"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="center_vertical"
android:text="¥100.0"
android:textColor="#F56C6C"
android:textSize="22dp" />
<ImageView
android:id="@+id/deleteOrder"
android:layout_width="35dp"
android:layout_marginEnd="4sp"
android:layout_height="match_parent"
android:src="@drawable/ic_baseline_delete_24dp" />
<Button
android:id="@+id/placeBuyBtn"
android:layout_width="wrap_content"
android:textSize="20sp"
android:textColor="#fff"
android:layout_height="match_parent"
android:layout_margin="8dp"
android:background="@drawable/place_buy_btn"
android:text="@string/place_order_btn" />
</LinearLayout>
</LinearLayout>

@ -0,0 +1,39 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:weightSum="10"
tools:context=".ui.JD.TaobaoFragment">
<LinearLayout
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="3"
android:orientation="vertical">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/snackLeftRecyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#4DEEEEEE"
android:overScrollMode="never" />
</LinearLayout>
<LinearLayout
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="7"
android:orientation="vertical"
android:overScrollMode="never">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/snackRightRecyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/colorBgWhite"
android:overScrollMode="never" />
</LinearLayout>
</LinearLayout>

@ -0,0 +1,15 @@
<?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="wrap_content"
android:layout_marginBottom="6sp"
android:orientation="vertical">
<ImageView
android:id="@+id/headHomeImage"
android:layout_width="match_parent"
android:layout_height="310dp"
android:scaleType="centerCrop"
app:srcCompat="@mipmap/banner" />
</LinearLayout>

@ -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="wrap_content"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:padding="4sp"
android:layout_height="wrap_content"
android:orientation="vertical">
<ImageView
android:id="@+id/homeSnackImage"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:adjustViewBounds="true"
android:scaleType="fitCenter"
app:srcCompat="@mipmap/banner" />
</LinearLayout>
</LinearLayout>

@ -0,0 +1,87 @@
<?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"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="12dp"
android:layout_marginTop="8dp"
android:layout_marginRight="12dp"
android:layout_marginBottom="4dp"
android:background="@drawable/radius_content"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingStart="16sp"
android:paddingTop="8sp"
android:paddingBottom="8sp"
tools:ignore="RtlSymmetry">
<TextView
android:id="@+id/orderName"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="TextView"
android:textSize="20sp" />
</LinearLayout>
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="#1A000000" />
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:scaleType="centerCrop"
android:id="@+id/orderImage"
android:layout_width="80dp"
android:layout_height="80dp"
android:layout_marginStart="16dp"
android:layout_marginTop="16dp"
android:layout_marginBottom="16dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/jd" />
<TextView
android:id="@+id/orderTime"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginTop="16dp"
android:text="TextView"
android:textSize="16sp"
app:layout_constraintStart_toEndOf="@+id/orderImage"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/orderMoney"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginTop="8dp"
android:text="TextView"
android:textSize="16sp"
app:layout_constraintStart_toEndOf="@+id/orderImage"
app:layout_constraintTop_toBottomOf="@+id/orderTime" />
<Button
android:id="@+id/button"
android:layout_width="60dp"
android:layout_height="40dp"
android:layout_marginEnd="16dp"
android:layout_marginBottom="16dp"
android:text="评价"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
</LinearLayout>

@ -0,0 +1,85 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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="110dp"
android:layout_marginLeft="12dp"
android:layout_marginTop="8dp"
android:layout_marginRight="12dp"
android:layout_marginBottom="4dp"
android:background="@drawable/place_order_item">
<ImageView
android:id="@+id/placeOrderImage"
android:layout_width="90dp"
android:layout_height="90dp"
android:layout_marginStart="16dp"
android:scaleType="centerCrop"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/jd" />
<TextView
android:id="@+id/placeOrderName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="14dp"
android:layout_marginTop="10dp"
android:text="TextView"
android:textSize="22sp"
app:layout_constraintStart_toEndOf="@+id/placeOrderImage"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/placeOrderPrice"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="14dp"
android:layout_marginTop="6dp"
android:text="TextView"
android:textColor="#F56C6C"
android:textSize="18sp"
app:layout_constraintStart_toEndOf="@+id/placeOrderImage"
app:layout_constraintTop_toBottomOf="@+id/placeOrderName" />
<LinearLayout
android:layout_width="110dp"
android:layout_height="36dp"
android:layout_marginEnd="13dp"
android:layout_marginBottom="14dp"
android:orientation="horizontal"
android:weightSum="10"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent">
<TextView
android:id="@+id/orderLessLabel"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="3"
android:gravity="center"
android:text="@string/place_less_label"
android:textSize="22dp" />
<Button
android:id="@+id/orderCountBtn"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="4"
android:enabled="false"
android:gravity="center"
android:text="@string/place_order_count_init"
android:textColor="#606266"
android:textSize="12sp" />
<TextView
android:id="@+id/orderAddLabel"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="3"
android:gravity="center"
android:text="@string/place_add_label"
android:textSize="22dp" />
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/snackLeftView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/colorContent">
<TextView
android:id="@+id/snackLeftType"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:padding="12dp"
android:text="@string/title_place"
android:textSize="16sp" />
</LinearLayout>

@ -0,0 +1,55 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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="100dp"
android:layout_marginLeft="10dp"
android:layout_marginTop="6sp"
android:layout_marginRight="10dp"
android:layout_marginBottom="2sp"
android:background="@drawable/snack_right_item">
<ImageView
android:id="@+id/snackRightImage"
android:layout_width="80dp"
android:layout_height="80dp"
android:layout_marginStart="12dp"
android:scaleType="centerCrop"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/jd" />
<TextView
android:id="@+id/snackRightName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginTop="10dp"
android:text="TextView"
android:textSize="20sp"
app:layout_constraintStart_toEndOf="@+id/snackRightImage"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/snackRightPrice"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginTop="2dp"
android:text="TextView"
android:textColor="#F56C6C"
android:textSize="16sp"
app:layout_constraintStart_toEndOf="@+id/snackRightImage"
app:layout_constraintTop_toBottomOf="@+id/snackRightName" />
<Button
android:id="@+id/snackRightAddBtn"
android:layout_width="48dp"
android:layout_height="48dp"
android:layout_marginEnd="14dp"
android:layout_marginBottom="12dp"
android:text="@string/snack_add_btn"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

@ -0,0 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/navigation_home"
android:icon="@drawable/ic_home_black_24dp"
android:title="首页" />
<item
android:id="@+id/navigation_snack"
android:icon="@drawable/ic_di2"
android:title="商店" />
<item
android:id="@+id/navigation_place"
android:icon="@drawable/ic_cart_black_24dp"
android:title="@string/title_place" />
<item
android:id="@+id/navigation_my"
android:icon="@drawable/ic_my_black_24dp"
android:title="@string/title_my" />
</menu>

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@drawable/ic_launcher_background" />
<foreground android:drawable="@drawable/ic_launcher_foreground" />
</adaptive-icon>

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@drawable/ic_launcher_background" />
<foreground android:drawable="@drawable/ic_launcher_foreground" />
</adaptive-icon>

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save