Преглед изворни кода

[1001696]增加启屏页、tab页

zk пре 2 година
родитељ
комит
5839b48ba7
35 измењених фајлова са 707 додато и 2 уклоњено
  1. 16 1
      app/src/main/AndroidManifest.xml
  2. 4 0
      app/src/main/java/com/datarecovery/master/App.java
  3. 20 0
      app/src/main/java/com/datarecovery/master/module/example/ExampleFragment.java
  4. 20 0
      app/src/main/java/com/datarecovery/master/module/homepage/HomePageFragment.java
  5. 153 0
      app/src/main/java/com/datarecovery/master/module/main/MainActivity.java
  6. 95 0
      app/src/main/java/com/datarecovery/master/module/main/MainPagerAdapter.java
  7. 20 0
      app/src/main/java/com/datarecovery/master/module/mine/MineFragment.java
  8. 19 0
      app/src/main/java/com/datarecovery/master/module/order/OrderFragment.java
  9. 65 0
      app/src/main/java/com/datarecovery/master/module/splash/SplashActivity.java
  10. 49 0
      app/src/main/java/com/datarecovery/master/utils/ActivityForResultUtil.java
  11. 23 0
      app/src/main/java/com/datarecovery/master/utils/BoxingUtil.java
  12. 53 0
      app/src/main/java/com/datarecovery/master/utils/SystemUtil.java
  13. 40 0
      app/src/main/java/com/datarecovery/master/utils/ToastUtil.java
  14. 5 0
      app/src/main/res/color/selector_main_tab_name.xml
  15. BIN
      app/src/main/res/drawable-xxhdpi/icon_main_tab_example.webp
  16. BIN
      app/src/main/res/drawable-xxhdpi/icon_main_tab_example_selected.webp
  17. BIN
      app/src/main/res/drawable-xxhdpi/icon_main_tab_main.webp
  18. BIN
      app/src/main/res/drawable-xxhdpi/icon_main_tab_main_selected.webp
  19. BIN
      app/src/main/res/drawable-xxhdpi/icon_main_tab_mine.webp
  20. BIN
      app/src/main/res/drawable-xxhdpi/icon_main_tab_mine_selected.webp
  21. BIN
      app/src/main/res/drawable-xxhdpi/icon_main_tab_order.webp
  22. BIN
      app/src/main/res/drawable-xxhdpi/icon_main_tab_order_selected.webp
  23. 5 0
      app/src/main/res/drawable/selector_icon_main_tab_example.xml
  24. 5 0
      app/src/main/res/drawable/selector_icon_main_tab_home_page.xml
  25. 5 0
      app/src/main/res/drawable/selector_icon_main_tab_mine.xml
  26. 5 0
      app/src/main/res/drawable/selector_icon_main_tab_order.xml
  27. 23 0
      app/src/main/res/layout/activity_main.xml
  28. 16 0
      app/src/main/res/layout/activity_splash.xml
  29. 6 0
      app/src/main/res/layout/fragment_example.xml
  30. 6 0
      app/src/main/res/layout/fragment_home_page.xml
  31. 6 0
      app/src/main/res/layout/fragment_mine.xml
  32. 6 0
      app/src/main/res/layout/fragment_order.xml
  33. 34 0
      app/src/main/res/layout/item_main_tab_layout.xml
  34. 1 1
      app/src/main/res/values/colors.xml
  35. 7 0
      app/src/main/res/values/strings.xml

+ 16 - 1
app/src/main/AndroidManifest.xml

@@ -9,6 +9,7 @@
 
     <application
         android:allowBackup="true"
+        android:name=".App"
         android:dataExtractionRules="@xml/data_extraction_rules"
         android:fullBackupContent="@xml/backup_rules"
         android:icon="@mipmap/ic_launcher"
@@ -16,11 +17,25 @@
         android:networkSecurityConfig="@xml/network_config"
         android:roundIcon="@mipmap/ic_launcher_round"
         android:supportsRtl="true"
-        tools:ignore="LockedOrientationActivity"
         android:theme="@style/Theme.DataRecover"
+        tools:ignore="LockedOrientationActivity"
         tools:replace="android:allowBackup"
         tools:targetApi="31">
 
+        <activity
+            android:name=".module.splash.SplashActivity"
+            android:exported="true"
+            android:screenOrientation="portrait"
+            android:theme="@style/Theme.Splash">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+        </activity>
+        <activity
+            android:name=".module.main.MainActivity"
+            android:screenOrientation="portrait" />
 
     </application>
 

+ 4 - 0
app/src/main/java/com/datarecovery/master/App.java

@@ -4,6 +4,10 @@ import com.atmob.app.lib.base.BaseApplication;
 import com.atmob.user.AtmobUser;
 import com.datarecovery.master.data.consts.Constants;
 
+import dagger.hilt.android.HiltAndroidApp;
+
+
+@HiltAndroidApp
 public class App extends BaseApplication {
     @Override
     protected boolean isDebug() {

+ 20 - 0
app/src/main/java/com/datarecovery/master/module/example/ExampleFragment.java

@@ -0,0 +1,20 @@
+package com.datarecovery.master.module.example;
+
+import androidx.annotation.NonNull;
+
+import com.atmob.app.lib.base.BaseFragment;
+import com.datarecovery.master.databinding.FragmentExampleBinding;
+import com.gyf.immersionbar.ImmersionBar;
+
+import dagger.hilt.android.AndroidEntryPoint;
+
+
+@AndroidEntryPoint
+public class ExampleFragment extends BaseFragment<FragmentExampleBinding> {
+
+
+    @Override
+    protected void configImmersion(@NonNull ImmersionBar immersionBar) {
+        immersionBar.statusBarDarkFont(true);
+    }
+}

+ 20 - 0
app/src/main/java/com/datarecovery/master/module/homepage/HomePageFragment.java

@@ -0,0 +1,20 @@
+package com.datarecovery.master.module.homepage;
+
+import androidx.annotation.NonNull;
+
+import com.atmob.app.lib.base.BaseFragment;
+import com.datarecovery.master.databinding.FragmentHomePageBinding;
+import com.gyf.immersionbar.ImmersionBar;
+
+import dagger.hilt.android.AndroidEntryPoint;
+
+
+@AndroidEntryPoint
+public class HomePageFragment extends BaseFragment<FragmentHomePageBinding> {
+
+
+    @Override
+    protected void configImmersion(@NonNull ImmersionBar immersionBar) {
+        immersionBar.statusBarDarkFont(true);
+    }
+}

+ 153 - 0
app/src/main/java/com/datarecovery/master/module/main/MainActivity.java

@@ -0,0 +1,153 @@
+package com.datarecovery.master.module.main;
+
+import static android.view.View.GONE;
+import static android.view.View.VISIBLE;
+
+import android.app.Activity;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Bundle;
+import android.view.KeyEvent;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.fragment.app.Fragment;
+
+import com.atmob.app.lib.base.BaseActivity;
+import com.datarecovery.master.R;
+import com.datarecovery.master.databinding.ActivityMainBinding;
+import com.datarecovery.master.databinding.ItemMainTabLayoutBinding;
+import com.datarecovery.master.utils.ToastUtil;
+import com.google.android.material.tabs.TabLayout;
+import com.google.android.material.tabs.TabLayoutMediator;
+import com.gyf.immersionbar.ImmersionBar;
+
+import java.util.List;
+
+import dagger.hilt.android.AndroidEntryPoint;
+
+
+@AndroidEntryPoint
+public class MainActivity extends BaseActivity<ActivityMainBinding> {
+
+
+    private TabLayoutMediator tabLayoutMediator;
+    private MainPagerAdapter mainPagerAdapter;
+    private long mExitTime;
+
+    public static void start(Context context) {
+        Intent intent = new Intent(context, MainActivity.class);
+        if (!(context instanceof Activity)) {
+            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+        }
+        context.startActivity(intent);
+    }
+
+
+    @Override
+    protected void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        initView();
+        initObserver();
+    }
+
+    private void initObserver() {
+
+    }
+
+    private void initView() {
+        initViewPager();
+        initTabLayout();
+    }
+
+    private void initViewPager() {
+        mainPagerAdapter = new MainPagerAdapter(this);
+        binding.mainViewPager.setAdapter(mainPagerAdapter);
+        binding.mainViewPager.setUserInputEnabled(false);
+        binding.mainViewPager.setOffscreenPageLimit(mainPagerAdapter.getItemCount());
+    }
+
+    private void initTabLayout() {
+        binding.mainTabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
+            @Override
+            public void onTabSelected(TabLayout.Tab tab) {
+                ItemMainTabLayoutBinding itemBinding = (ItemMainTabLayoutBinding) tab.getTag();
+                if (itemBinding != null) {
+                    itemBinding.tabText.setSelected(true);
+                    itemBinding.tabIcon.setSelected(true);
+                }
+//                Class<? extends Fragment> pagerClass = mainPagerAdapter.getMainPagerItemByPosition(tab.getPosition()).getPagerClass();
+//                if (pagerClass.equals(FriendsFragment.class)) {
+//
+//                } else if (pagerClass.equals(LocationFragment.class)) {
+//
+//                } else if (pagerClass.equals(MessageFragment.class)) {
+//
+//                } else if (pagerClass.equals(MineFragment.class)) {
+//
+//                }
+            }
+
+            @Override
+            public void onTabUnselected(TabLayout.Tab tab) {
+                ItemMainTabLayoutBinding itemBinding = (ItemMainTabLayoutBinding) tab.getTag();
+                if (itemBinding != null) {
+                    itemBinding.tabText.setSelected(false);
+                    itemBinding.tabIcon.setSelected(false);
+                }
+            }
+
+            @Override
+            public void onTabReselected(TabLayout.Tab tab) {
+
+            }
+        });
+        tabLayoutMediator = new TabLayoutMediator(binding.mainTabLayout, binding.mainViewPager, true, false, (tab, position) -> {
+            MainPagerAdapter.MainPagerItem mainPagerItem = mainPagerAdapter.getMainPagerItemByPosition(position);
+            ItemMainTabLayoutBinding itemBinding = ItemMainTabLayoutBinding.inflate(getLayoutInflater());
+            itemBinding.tabText.setText(mainPagerItem.getTabName());
+            itemBinding.tabIcon.setImageResource(mainPagerItem.getTabIcon());
+            tab.setCustomView(itemBinding.getRoot());
+            tab.setTag(itemBinding);
+        });
+        tabLayoutMediator.attach();
+    }
+
+
+    @Override
+    protected void onDestroy() {
+        super.onDestroy();
+        if (tabLayoutMediator != null) {
+            tabLayoutMediator.detach();
+        }
+    }
+
+    @Override
+    public boolean onKeyDown(int keyCode, KeyEvent event) {
+        if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {
+            exit();
+            return true;
+        }
+        return super.onKeyDown(keyCode, event);
+    }
+
+    public void exit() {
+        if ((System.currentTimeMillis() - mExitTime) > 2000) {
+            ToastUtil.show(R.string.exit_application_text, ToastUtil.LENGTH_LONG);
+            mExitTime = System.currentTimeMillis();
+        } else {
+            try {
+                Intent intent = new Intent();
+                intent.setAction(Intent.ACTION_MAIN);
+                intent.addCategory(Intent.CATEGORY_HOME);
+                startActivity(intent);
+            } catch (Exception ignore) {
+            }
+        }
+    }
+
+    @Override
+    protected boolean shouldImmersion() {
+        return true;
+    }
+}

+ 95 - 0
app/src/main/java/com/datarecovery/master/module/main/MainPagerAdapter.java

@@ -0,0 +1,95 @@
+package com.datarecovery.master.module.main;
+
+import androidx.annotation.NonNull;
+import androidx.fragment.app.Fragment;
+import androidx.fragment.app.FragmentActivity;
+import androidx.viewpager2.adapter.FragmentStateAdapter;
+
+import com.datarecovery.master.R;
+import com.datarecovery.master.module.mine.MineFragment;
+import com.datarecovery.master.module.example.ExampleFragment;
+import com.datarecovery.master.module.homepage.HomePageFragment;
+import com.datarecovery.master.module.order.OrderFragment;
+
+import java.util.Arrays;
+import java.util.List;
+
+public class MainPagerAdapter extends FragmentStateAdapter {
+
+    private final List<MainPagerItem> mainPagerItems = Arrays.asList(
+            new MainPagerItem(R.string.main_pager_front_page, R.drawable.selector_icon_main_tab_home_page, HomePageFragment.class),
+            new MainPagerItem(R.string.main_pager_example, R.drawable.selector_icon_main_tab_example, ExampleFragment.class),
+            new MainPagerItem(R.string.main_pager_order, R.drawable.selector_icon_main_tab_order, OrderFragment.class),
+            new MainPagerItem(R.string.main_pager_mine, R.drawable.selector_icon_main_tab_mine, MineFragment.class)
+    );
+
+    public MainPagerAdapter(@NonNull FragmentActivity fragmentActivity) {
+        super(fragmentActivity);
+    }
+
+    public int getPosition(Class<? extends Fragment> cls) {
+        if (mainPagerItems == null || mainPagerItems.isEmpty()) {
+            return 0;
+        }
+        for (int i = 0; i < mainPagerItems.size(); i++) {
+            MainPagerItem mainPagerItem = mainPagerItems.get(i);
+            if (mainPagerItem.pagerClass == cls) {
+                return i;
+            }
+        }
+        return 0;
+    }
+
+    @NonNull
+    @Override
+    public Fragment createFragment(int position) {
+        MainPagerItem mainPagerItem = mainPagerItems.get(position);
+        Class<? extends Fragment> pagerClass = mainPagerItem.getPagerClass();
+        return createFragmentByClass(pagerClass);
+    }
+
+    private Fragment createFragmentByClass(Class<? extends Fragment> pagerClass) {
+        try {
+            return pagerClass.newInstance();
+        } catch (IllegalAccessException | InstantiationException e) {
+            e.printStackTrace();
+        }
+        throw new RuntimeException();
+    }
+
+    @Override
+    public int getItemCount() {
+        return mainPagerItems.size();
+    }
+
+    public MainPagerItem getMainPagerItemByPosition(int position) {
+        if (position < 0 || position >= mainPagerItems.size()) {
+            return null;
+        }
+        return mainPagerItems.get(position);
+    }
+
+    public static class MainPagerItem {
+        private final int tabName;
+        private final int tabIcon;
+        private final Class<? extends Fragment> pagerClass;
+
+        public MainPagerItem(int tabName, int tabIcon, Class<? extends Fragment> pagerClass) {
+            this.tabName = tabName;
+            this.tabIcon = tabIcon;
+            this.pagerClass = pagerClass;
+        }
+
+        public int getTabName() {
+            return tabName;
+        }
+
+        public int getTabIcon() {
+            return tabIcon;
+        }
+
+        public Class<? extends Fragment> getPagerClass() {
+            return pagerClass;
+        }
+    }
+}

+ 20 - 0
app/src/main/java/com/datarecovery/master/module/mine/MineFragment.java

@@ -0,0 +1,20 @@
+package com.datarecovery.master.module.mine;
+
+import androidx.annotation.NonNull;
+
+import com.atmob.app.lib.base.BaseFragment;
+import com.datarecovery.master.databinding.FragmentMineBinding;
+import com.gyf.immersionbar.ImmersionBar;
+
+import dagger.hilt.android.AndroidEntryPoint;
+
+
+@AndroidEntryPoint
+public class MineFragment extends BaseFragment<FragmentMineBinding> {
+
+
+    @Override
+    protected void configImmersion(@NonNull ImmersionBar immersionBar) {
+        immersionBar.statusBarDarkFont(true);
+    }
+}

+ 19 - 0
app/src/main/java/com/datarecovery/master/module/order/OrderFragment.java

@@ -0,0 +1,19 @@
+package com.datarecovery.master.module.order;
+
+import androidx.annotation.NonNull;
+
+import com.atmob.app.lib.base.BaseFragment;
+import com.datarecovery.master.databinding.FragmentOrderBinding;
+import com.gyf.immersionbar.ImmersionBar;
+
+import dagger.hilt.android.AndroidEntryPoint;
+
+@AndroidEntryPoint
+public class OrderFragment extends BaseFragment<FragmentOrderBinding> {
+
+
+    @Override
+    protected void configImmersion(@NonNull ImmersionBar immersionBar) {
+        immersionBar.statusBarDarkFont(true);
+    }
+}

+ 65 - 0
app/src/main/java/com/datarecovery/master/module/splash/SplashActivity.java

@@ -0,0 +1,65 @@
+package com.datarecovery.master.module.splash;
+
+
+import android.annotation.SuppressLint;
+import android.os.Bundle;
+import android.os.Handler;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
+import com.atmob.app.lib.base.BaseActivity;
+import com.atmob.user.AtmobUser;
+import com.datarecovery.master.databinding.ActivitySplashBinding;
+import com.datarecovery.master.module.main.MainActivity;
+import com.gyf.immersionbar.ImmersionBar;
+
+@SuppressLint("CustomSplashScreen")
+public class SplashActivity extends BaseActivity<ActivitySplashBinding> {
+
+
+    private final int delayMillis = 3000;
+
+    @Override
+    protected void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        AtmobUser.recordPolicyGrant(true);
+        checkPolicy();
+    }
+
+    private void checkPolicy() {
+        if (AtmobUser.isPolicyGranted()) {
+            nextStep();
+        } else {
+            showPolicyDialog();
+        }
+    }
+
+    private void nextStep() {
+        showMain();
+    }
+
+    private void showMain() {
+        new Handler().postDelayed(this::goMain, delayMillis);
+    }
+
+    private void goMain() {
+        MainActivity.start(this);
+        finishAfterTransition();
+    }
+
+    private void showPolicyDialog() {
+
+    }
+
+    @Override
+    protected boolean shouldImmersion() {
+        return true;
+    }
+
+    @Override
+    protected void configImmersion(@NonNull ImmersionBar immersionBar) {
+        immersionBar.statusBarDarkFont(false);
+    }
+
+}

+ 49 - 0
app/src/main/java/com/datarecovery/master/utils/ActivityForResultUtil.java

@@ -0,0 +1,49 @@
+package com.datarecovery.master.utils;
+
+
+import androidx.activity.ComponentActivity;
+import androidx.activity.result.ActivityResultCallback;
+import androidx.activity.result.ActivityResultLauncher;
+import androidx.activity.result.ActivityResultRegistry;
+import androidx.activity.result.contract.ActivityResultContract;
+import androidx.annotation.NonNull;
+import androidx.lifecycle.Lifecycle;
+import androidx.lifecycle.LifecycleEventObserver;
+import androidx.lifecycle.LifecycleOwner;
+
+import java.util.UUID;
+
+public class ActivityForResultUtil<I, O> {
+
+
+    ActivityResultLauncher<I> launcher = null;
+
+
+    public void startActivityForResult(ComponentActivity activity, ActivityResultContract<I, O> contract, I input, ActivityResultCallback<O> callback) {
+        String key = UUID.randomUUID().toString();
+
+        ActivityResultRegistry registry = activity.getActivityResultRegistry();
+        LifecycleEventObserver observer = new LifecycleEventObserver() {
+
+            @Override
+            public void onStateChanged(@NonNull LifecycleOwner lifecycleOwner, @NonNull Lifecycle.Event event) {
+                if (Lifecycle.Event.ON_DESTROY == event) {
+                    if (launcher != null) {
+                        launcher.unregister();
+                    }
+                    activity.getLifecycle().removeObserver(this);
+                }
+            }
+        };
+        activity.getLifecycle().addObserver(observer);
+
+        launcher = registry.register(key, contract, result -> {
+            if (launcher != null) {
+                launcher.unregister();
+            }
+            activity.getLifecycle().removeObserver(observer);
+            callback.onActivityResult(result);
+        });
+        launcher.launch(input);
+    }
+}

+ 23 - 0
app/src/main/java/com/datarecovery/master/utils/BoxingUtil.java

@@ -0,0 +1,23 @@
+package com.datarecovery.master.utils;
+
+public class BoxingUtil {
+    private BoxingUtil() {
+
+    }
+
+    public static boolean boxing(Boolean b) {
+        return b != null && b;
+    }
+
+    public static int boxing(Integer integer) {
+        return integer == null ? 0 : integer;
+    }
+
+    public static long boxing(Long l) {
+        return l == null ? 0 : l;
+    }
+
+    public static float boxing(Float f) {
+        return f == null ? 0f : f;
+    }
+}

+ 53 - 0
app/src/main/java/com/datarecovery/master/utils/SystemUtil.java

@@ -0,0 +1,53 @@
+package com.datarecovery.master.utils;
+
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.view.inputmethod.InputMethodManager;
+import android.widget.EditText;
+
+public class SystemUtil {
+
+
+    /**
+     * 获取当前apk的版本号
+     *
+     * @param context
+     * @return
+     */
+    public static int getVersionCode(Context context) {
+        int versionCode = 0;
+        try {
+            versionCode = context.getPackageManager().
+                    getPackageInfo(context.getPackageName(), 0).versionCode;
+        } catch (PackageManager.NameNotFoundException e) {
+            e.printStackTrace();
+        }
+        return versionCode;
+    }
+
+    /**
+     * 获取当前apk的版本名
+     *
+     * @param context
+     * @return
+     */
+    public static String getVersionName(Context context) {
+        String versionName = "";
+        try {
+            versionName = context.getPackageManager().
+                    getPackageInfo(context.getPackageName(), 0).versionName;
+        } catch (PackageManager.NameNotFoundException e) {
+            e.printStackTrace();
+        }
+        return versionName;
+    }
+
+
+    public static void hideSoftKeyboard(Context context, EditText view) {
+        InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
+        if (view != null) {
+            imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
+        }
+    }
+
+}

+ 40 - 0
app/src/main/java/com/datarecovery/master/utils/ToastUtil.java

@@ -0,0 +1,40 @@
+package com.datarecovery.master.utils;
+
+import android.widget.Toast;
+
+import androidx.annotation.IntDef;
+import androidx.annotation.StringRes;
+
+import com.atmob.common.runtime.ContextUtil;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+/**
+ * 测试高版本的Android已经不会把Toast堆在一起了, 后期遇到问题再修改此处的实现吧.
+ */
+public class ToastUtil {
+
+    @IntDef(value = {
+            LENGTH_SHORT,
+            LENGTH_LONG
+    })
+    @Retention(RetentionPolicy.SOURCE)
+    public @interface Duration {
+    }
+
+    public static final int LENGTH_SHORT = 0;
+
+    public static final int LENGTH_LONG = 1;
+
+    private ToastUtil() {
+    }
+
+    public static void show(String message, @Duration int duration) {
+        Toast.makeText(ContextUtil.getContext(), message, duration).show();
+    }
+
+    public static void show(@StringRes int messageRes, @Duration int duration) {
+        Toast.makeText(ContextUtil.getContext(), messageRes, duration).show();
+    }
+}

+ 5 - 0
app/src/main/res/color/selector_main_tab_name.xml

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

BIN
app/src/main/res/drawable-xxhdpi/icon_main_tab_example.webp


BIN
app/src/main/res/drawable-xxhdpi/icon_main_tab_example_selected.webp


BIN
app/src/main/res/drawable-xxhdpi/icon_main_tab_main.webp


BIN
app/src/main/res/drawable-xxhdpi/icon_main_tab_main_selected.webp


BIN
app/src/main/res/drawable-xxhdpi/icon_main_tab_mine.webp


BIN
app/src/main/res/drawable-xxhdpi/icon_main_tab_mine_selected.webp


BIN
app/src/main/res/drawable-xxhdpi/icon_main_tab_order.webp


BIN
app/src/main/res/drawable-xxhdpi/icon_main_tab_order_selected.webp


+ 5 - 0
app/src/main/res/drawable/selector_icon_main_tab_example.xml

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

+ 5 - 0
app/src/main/res/drawable/selector_icon_main_tab_home_page.xml

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

+ 5 - 0
app/src/main/res/drawable/selector_icon_main_tab_mine.xml

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

+ 5 - 0
app/src/main/res/drawable/selector_icon_main_tab_order.xml

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

+ 23 - 0
app/src/main/res/layout/activity_main.xml

@@ -0,0 +1,23 @@
+<?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="match_parent">
+
+    <androidx.viewpager2.widget.ViewPager2
+        android:id="@+id/main_view_pager"
+        android:layout_width="match_parent"
+        android:layout_height="0dp"
+        app:layout_constraintBottom_toTopOf="@id/main_tab_layout"
+        app:layout_constraintTop_toTopOf="parent" />
+
+    <com.google.android.material.tabs.TabLayout
+        android:id="@+id/main_tab_layout"
+        android:layout_width="match_parent"
+        android:layout_height="0dp"
+        android:translationZ="10dp"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintDimensionRatio="360:56"
+        app:tabIconTint="@android:color/transparent"
+        app:tabIndicator="@null" />
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 16 - 0
app/src/main/res/layout/activity_splash.xml

@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto">
+
+    <data>
+
+    </data>
+
+    <androidx.constraintlayout.widget.ConstraintLayout
+        android:id="@+id/cl_layout"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:background="@drawable/bg_theme_splash">
+
+    </androidx.constraintlayout.widget.ConstraintLayout>
+</layout>

+ 6 - 0
app/src/main/res/layout/fragment_example.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 6 - 0
app/src/main/res/layout/fragment_home_page.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 6 - 0
app/src/main/res/layout/fragment_mine.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 6 - 0
app/src/main/res/layout/fragment_order.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 34 - 0
app/src/main/res/layout/item_main_tab_layout.xml

@@ -0,0 +1,34 @@
+<?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:gravity="center"
+    android:orientation="vertical">
+
+    <ImageView
+        android:id="@+id/tab_icon"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        app:layout_constraintBottom_toTopOf="@id/tab_text"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintRight_toRightOf="parent"
+        app:layout_constraintTop_toTopOf="parent"
+        app:layout_constraintVertical_chainStyle="packed"
+        tools:src="@drawable/icon_main_tab_main" />
+
+    <TextView
+        android:id="@+id/tab_text"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="2dp"
+        android:textColor="@color/selector_main_tab_name"
+        android:textSize="10sp"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintRight_toRightOf="parent"
+        app:layout_constraintTop_toBottomOf="@id/tab_icon"
+        tools:ignore="SmallSp"
+        tools:text="首页" />
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 1 - 1
app/src/main/res/values/colors.xml

@@ -7,5 +7,5 @@
     <color name="colorPrimaryVariant">#E0EBFF</color>
 
     <color name="common_txt_color">#202020</color>
-
+    <color name="main_tab_name_text_color">#999999</color>
 </resources>

+ 7 - 0
app/src/main/res/values/strings.xml

@@ -1,3 +1,10 @@
 <resources>
     <string name="app_name">DataRecover</string>
+
+    <string name="main_pager_front_page">首页</string>
+    <string name="main_pager_example">案例</string>
+    <string name="main_pager_order">订单</string>
+    <string name="main_pager_mine">我的</string>
+
+    <string name="exit_application_text">再按一次退出程序</string>
 </resources>