From 41ea86db01fa8df285d9339819650a811fd9931a Mon Sep 17 00:00:00 2001 From: DelLevin-Home Date: Tue, 10 Feb 2026 23:17:45 +0800 Subject: [PATCH] 222 --- app/build.gradle | 6 + .../java/top/iletter/lvnote/BookAdapter.java | 57 ++++++++ .../iletter/lvnote/BookContainerFragment.java | 100 ++++++++++++++ .../top/iletter/lvnote/BookListFragment.java | 65 --------- .../iletter/lvnote/BookStatusFragment.java | 99 +++++++++++++ .../java/top/iletter/lvnote/FragmentHome.java | 66 +++------ .../top/iletter/lvnote/FragmentProfile.java | 11 +- .../java/top/iletter/lvnote/MainActivity.java | 61 ++++---- .../java/top/iletter/lvnote/MediaAdapter.java | 52 ------- .../top/iletter/lvnote/MediaListFragment.java | 89 ------------ .../java/top/iletter/lvnote/MovieAdapter.java | 59 ++++++++ .../lvnote/MovieContainerFragment.java | 102 ++++++++++++++ .../top/iletter/lvnote/MovieListFragment.java | 68 --------- .../iletter/lvnote/MovieStatusFragment.java | 107 ++++++++++++++ .../java/top/iletter/lvnote/NoteAdapter.java | 20 ++- .../top/iletter/lvnote/NoteListFragment.java | 39 ++++-- .../main/res/color/segmented_button_bg.xml | 5 + .../main/res/color/segmented_button_text.xml | 7 + app/src/main/res/drawable/ic_home.xml | 6 +- app/src/main/res/drawable/ic_person.xml | 6 +- app/src/main/res/layout/activity_main.xml | 32 ++--- .../res/layout/fragment_book_container.xml | 61 ++++++++ .../main/res/layout/fragment_book_list.xml | 16 --- ...edia_list.xml => fragment_book_status.xml} | 8 +- app/src/main/res/layout/fragment_home.xml | 39 +++--- .../res/layout/fragment_movie_container.xml | 57 ++++++++ .../main/res/layout/fragment_movie_list.xml | 16 --- .../main/res/layout/fragment_movie_status.xml | 30 ++++ .../main/res/layout/fragment_note_list.xml | 4 +- app/src/main/res/layout/fragment_profile.xml | 62 ++++----- app/src/main/res/layout/item_book.xml | 120 ++++++++++++++++ app/src/main/res/layout/item_media.xml | 70 ---------- app/src/main/res/layout/item_movie.xml | 130 ++++++++++++++++++ app/src/main/res/layout/item_note.xml | 63 +++++---- app/src/main/res/values/colors.xml | 11 +- app/src/main/res/values/strings.xml | 13 +- app/src/main/res/values/themes.xml | 80 ++++++++--- 37 files changed, 1200 insertions(+), 637 deletions(-) create mode 100644 app/src/main/java/top/iletter/lvnote/BookAdapter.java create mode 100644 app/src/main/java/top/iletter/lvnote/BookContainerFragment.java delete mode 100644 app/src/main/java/top/iletter/lvnote/BookListFragment.java create mode 100644 app/src/main/java/top/iletter/lvnote/BookStatusFragment.java delete mode 100644 app/src/main/java/top/iletter/lvnote/MediaAdapter.java delete mode 100644 app/src/main/java/top/iletter/lvnote/MediaListFragment.java create mode 100644 app/src/main/java/top/iletter/lvnote/MovieAdapter.java create mode 100644 app/src/main/java/top/iletter/lvnote/MovieContainerFragment.java delete mode 100644 app/src/main/java/top/iletter/lvnote/MovieListFragment.java create mode 100644 app/src/main/java/top/iletter/lvnote/MovieStatusFragment.java create mode 100644 app/src/main/res/color/segmented_button_bg.xml create mode 100644 app/src/main/res/color/segmented_button_text.xml create mode 100644 app/src/main/res/layout/fragment_book_container.xml delete mode 100644 app/src/main/res/layout/fragment_book_list.xml rename app/src/main/res/layout/{fragment_media_list.xml => fragment_book_status.xml} (87%) create mode 100644 app/src/main/res/layout/fragment_movie_container.xml delete mode 100644 app/src/main/res/layout/fragment_movie_list.xml create mode 100644 app/src/main/res/layout/fragment_movie_status.xml create mode 100644 app/src/main/res/layout/item_book.xml delete mode 100644 app/src/main/res/layout/item_media.xml create mode 100644 app/src/main/res/layout/item_movie.xml diff --git a/app/build.gradle b/app/build.gradle index ac6ef84..8d4b777 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -47,4 +47,10 @@ dependencies { implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'androidx.fragment:fragment:1.6.2' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' + + implementation 'androidx.appcompat:appcompat:1.6.1' + implementation 'com.google.android.material:material:1.11.0' + implementation 'androidx.constraintlayout:constraintlayout:2.1.4' + implementation 'androidx.recyclerview:recyclerview:1.3.2' + implementation 'androidx.viewpager2:viewpager2:1.0.0' } \ No newline at end of file diff --git a/app/src/main/java/top/iletter/lvnote/BookAdapter.java b/app/src/main/java/top/iletter/lvnote/BookAdapter.java new file mode 100644 index 0000000..ef044c2 --- /dev/null +++ b/app/src/main/java/top/iletter/lvnote/BookAdapter.java @@ -0,0 +1,57 @@ +package top.iletter.lvnote; + +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import java.util.List; + +public class BookAdapter extends RecyclerView.Adapter { + private final List books; + + public BookAdapter(List books) { + this.books = books; + } + + @NonNull + @Override + public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(parent.getContext()) + .inflate(R.layout.item_book, parent, false); + return new ViewHolder(view); + } + + @Override + public void onBindViewHolder(@NonNull ViewHolder holder, int position) { + BookStatusFragment.BookItem book = books.get(position); + holder.title.setText(book.title); + holder.authors.setText(book.authors); + holder.publisher.setText(book.publisher); + holder.pages.setText(book.pages); + holder.isbn.setText(book.isbn); + holder.rating.setText(book.rating > 0 ? String.valueOf(book.rating) : "--"); + } + + @Override + public int getItemCount() { + return books.size(); + } + + static class ViewHolder extends RecyclerView.ViewHolder { + TextView title, authors, publisher, pages, isbn, rating; + + ViewHolder(View itemView) { + super(itemView); + title = itemView.findViewById(R.id.tv_title); + authors = itemView.findViewById(R.id.tv_authors); + publisher = itemView.findViewById(R.id.tv_publisher); + pages = itemView.findViewById(R.id.tv_pages); + isbn = itemView.findViewById(R.id.tv_isbn); + rating = itemView.findViewById(R.id.tv_rating); + } + } +} \ No newline at end of file diff --git a/app/src/main/java/top/iletter/lvnote/BookContainerFragment.java b/app/src/main/java/top/iletter/lvnote/BookContainerFragment.java new file mode 100644 index 0000000..bc2ed9d --- /dev/null +++ b/app/src/main/java/top/iletter/lvnote/BookContainerFragment.java @@ -0,0 +1,100 @@ +package top.iletter.lvnote; + +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.fragment.app.FragmentActivity; +import androidx.viewpager2.adapter.FragmentStateAdapter; +import androidx.viewpager2.widget.ViewPager2; + +import com.google.android.material.button.MaterialButtonToggleGroup; + +public class BookContainerFragment extends Fragment { + private ViewPager2 viewPager; + private MaterialButtonToggleGroup toggleGroup; + + @Nullable + @Override + public View onCreateView(@NonNull LayoutInflater inflater, + @Nullable ViewGroup container, + @Nullable Bundle savedInstanceState) { + return inflater.inflate(R.layout.fragment_book_container, container, false); + } + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + + viewPager = view.findViewById(R.id.view_pager_books); + // ✅ 修复:传入 requireActivity() + viewPager.setAdapter(new BookPagerAdapter(requireActivity())); + + toggleGroup = view.findViewById(R.id.toggle_books); + + toggleGroup.addOnButtonCheckedListener((group, checkedId, isChecked) -> { + if (isChecked) { + int position = getPositionByButtonId(checkedId); + viewPager.setCurrentItem(position, true); + } + }); + + viewPager.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() { + @Override + public void onPageSelected(int position) { + super.onPageSelected(position); + int buttonId = getButtonIdByPosition(position); + toggleGroup.check(buttonId); + } + }); + } + + // ✅ 修复:改用 if-else + private int getPositionByButtonId(int buttonId) { + if (buttonId == R.id.btn_read) return 0; + if (buttonId == R.id.btn_reading) return 1; + return 2; // btn_plan_read + } + + private int getButtonIdByPosition(int position) { + if (position == 0) return R.id.btn_read; + if (position == 1) return R.id.btn_reading; + return R.id.btn_plan_read; + } + + // ✅ 修复:适配器接收 FragmentActivity + static class BookPagerAdapter extends FragmentStateAdapter { + public BookPagerAdapter(@NonNull FragmentActivity activity) { + super(activity); + } + + @NonNull + @Override + public Fragment createFragment(int position) { + String status = position == 0 ? "read" : + position == 1 ? "reading" : "plan_to_read"; + return BookStatusFragment.newInstance(status); + } + + @Override + public int getItemCount() { + return 3; + } + } + + // ✅ 清理资源 + @Override + public void onDestroyView() { + super.onDestroyView(); + if (viewPager != null) { + viewPager.setAdapter(null); + } + if (toggleGroup != null) { + toggleGroup.clearChecked(); + } + } +} \ No newline at end of file diff --git a/app/src/main/java/top/iletter/lvnote/BookListFragment.java b/app/src/main/java/top/iletter/lvnote/BookListFragment.java deleted file mode 100644 index 6497729..0000000 --- a/app/src/main/java/top/iletter/lvnote/BookListFragment.java +++ /dev/null @@ -1,65 +0,0 @@ -package top.iletter.lvnote; - -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.viewpager2.adapter.FragmentStateAdapter; -import androidx.viewpager2.widget.ViewPager2; - -import com.google.android.material.tabs.TabLayout; -import com.google.android.material.tabs.TabLayoutMediator; - -public class BookListFragment extends Fragment { - - @Nullable - @Override - public View onCreateView(@NonNull LayoutInflater inflater, - @Nullable ViewGroup container, - @Nullable Bundle savedInstanceState) { - return inflater.inflate(R.layout.fragment_book_list, container, false); - } - - @Override - public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { - super.onViewCreated(view, savedInstanceState); - - ViewPager2 viewPagerSecondary = view.findViewById(R.id.view_pager_secondary); - viewPagerSecondary.setAdapter(new SecondaryPagerAdapter(this)); - - TabLayout tabSecondary = requireActivity().findViewById(R.id.tab_secondary); - tabSecondary.setVisibility(View.VISIBLE); - - new TabLayoutMediator(tabSecondary, viewPagerSecondary, (tab, position) -> { - switch (position) { - case 0: tab.setText("已读"); break; - case 1: tab.setText("在读"); break; - case 2: tab.setText("想读"); break; - } - }).attach(); - } - - static class SecondaryPagerAdapter extends FragmentStateAdapter { - public SecondaryPagerAdapter(@NonNull Fragment fragment) { - super(fragment); - } - - @NonNull - @Override - public Fragment createFragment(int position) { - return MediaListFragment.newInstance( - position == 0 ? "read" : - position == 1 ? "reading" : "plan_to_read" - ); - } - - @Override - public int getItemCount() { - return 3; - } - } -} \ No newline at end of file diff --git a/app/src/main/java/top/iletter/lvnote/BookStatusFragment.java b/app/src/main/java/top/iletter/lvnote/BookStatusFragment.java new file mode 100644 index 0000000..a833432 --- /dev/null +++ b/app/src/main/java/top/iletter/lvnote/BookStatusFragment.java @@ -0,0 +1,99 @@ +package top.iletter.lvnote; + +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import java.util.ArrayList; +import java.util.List; + +public class BookStatusFragment extends Fragment { + private static final String ARG_STATUS = "status"; + private String status; + + public static BookStatusFragment newInstance(String status) { + BookStatusFragment fragment = new BookStatusFragment(); + Bundle args = new Bundle(); + args.putString(ARG_STATUS, status); + fragment.setArguments(args); + return fragment; + } + + @Override + public void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + if (getArguments() != null) { + status = getArguments().getString(ARG_STATUS); + } + } + + @Nullable + @Override + public View onCreateView(@NonNull LayoutInflater inflater, + @Nullable ViewGroup container, + @Nullable Bundle savedInstanceState) { + return inflater.inflate(R.layout.fragment_book_status, container, false); + } + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + + RecyclerView recyclerView = view.findViewById(R.id.recycler_books); + TextView tvEmpty = view.findViewById(R.id.tv_empty); + recyclerView.setLayoutManager(new LinearLayoutManager(requireContext())); + + List books = generateFakeBooks(status); + if (books.isEmpty()) { + tvEmpty.setVisibility(View.VISIBLE); + recyclerView.setVisibility(View.GONE); + } else { + tvEmpty.setVisibility(View.GONE); + recyclerView.setVisibility(View.VISIBLE); + recyclerView.setAdapter(new BookAdapter(books)); + } + } + + private List generateFakeBooks(String status) { + List books = new ArrayList<>(); + switch (status) { + case "read": + books.add(new BookItem("三体", "刘慈欣", "重庆出版社", "400页", "9787229113890", 9.3f)); + books.add(new BookItem("活着", "余华", "作家出版社", "191页", "9787506365437", 9.4f)); + books.add(new BookItem("百年孤独", "加西亚·马尔克斯", "南海出版公司", "360页", "9787544253994", 9.2f)); + break; + case "reading": + books.add(new BookItem("人类简史", "尤瓦尔·赫拉利", "中信出版社", "424页", "9787508647357", 8.9f)); + books.add(new BookItem("三体Ⅱ:黑暗森林", "刘慈欣", "重庆出版社", "450页", "9787229113906", 9.2f)); + break; + case "plan_to_read": + books.add(new BookItem("追风筝的人", "卡勒德·胡赛尼", "上海人民出版社", "362页", "9787208061644", 0)); + books.add(new BookItem("小王子", "安托万·德·圣-埃克苏佩里", "天津人民出版社", "96页", "9787201076490", 0)); + break; + } + return books; + } + + public static class BookItem { + public String title, authors, publisher, pages, isbn; + public float rating; + + public BookItem(String title, String authors, String publisher, + String pages, String isbn, float rating) { + this.title = title; + this.authors = authors; + this.publisher = publisher; + this.pages = pages; + this.isbn = isbn; + this.rating = rating; + } + } +} \ No newline at end of file diff --git a/app/src/main/java/top/iletter/lvnote/FragmentHome.java b/app/src/main/java/top/iletter/lvnote/FragmentHome.java index 3b570c9..8de9574 100644 --- a/app/src/main/java/top/iletter/lvnote/FragmentHome.java +++ b/app/src/main/java/top/iletter/lvnote/FragmentHome.java @@ -8,6 +8,7 @@ import android.view.ViewGroup; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentActivity; import androidx.viewpager2.adapter.FragmentStateAdapter; import androidx.viewpager2.widget.ViewPager2; @@ -15,16 +16,8 @@ import com.google.android.material.tabs.TabLayout; import com.google.android.material.tabs.TabLayoutMediator; public class FragmentHome extends Fragment { - - private TabLayout tabMain; - private TabLayout tabSecondary; private ViewPager2 viewPagerMain; - // 三个主页面 - private final Fragment movieFragment = new MovieListFragment(); - private final Fragment bookFragment = new BookListFragment(); - private final Fragment noteFragment = new NoteListFragment(); - @Nullable @Override public View onCreateView(@NonNull LayoutInflater inflater, @@ -37,60 +30,33 @@ public class FragmentHome extends Fragment { public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); - tabMain = view.findViewById(R.id.tab_main); - tabSecondary = view.findViewById(R.id.tab_secondary); viewPagerMain = view.findViewById(R.id.view_pager_main); + TabLayout tabMain = view.findViewById(R.id.tab_main); - // 设置外层 ViewPager2 适配器 - viewPagerMain.setAdapter(new MainPagerAdapter(this)); + // 修复嵌套崩溃 + viewPagerMain.setAdapter(new MainPagerAdapter(requireActivity())); - // 绑定一级导航 + // 绑定导航 new TabLayoutMediator(tabMain, viewPagerMain, (tab, position) -> { switch (position) { - case 0: - tab.setText("观影记"); - break; - case 1: - tab.setText("书摘"); - break; - case 2: - tab.setText("随笔"); - break; + case 0: tab.setText("观影"); break; + case 1: tab.setText("书摘"); break; + case 2: tab.setText("随笔"); break; } }).attach(); - - // 一级 Tab 切换监听(控制二级导航显示/隐藏) - tabMain.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { - @Override - public void onTabSelected(TabLayout.Tab tab) { - // 随笔页面隐藏二级导航 - if (tab.getPosition() == 2) { - tabSecondary.setVisibility(View.GONE); - } else { - tabSecondary.setVisibility(View.VISIBLE); - } - } - - @Override - public void onTabUnselected(TabLayout.Tab tab) {} - - @Override - public void onTabReselected(TabLayout.Tab tab) {} - }); } - // 外层 ViewPager2 适配器 static class MainPagerAdapter extends FragmentStateAdapter { - public MainPagerAdapter(@NonNull Fragment fragment) { - super(fragment); + public MainPagerAdapter(@NonNull FragmentActivity activity) { + super(activity); } @NonNull @Override public Fragment createFragment(int position) { switch (position) { - case 0: return new MovieListFragment(); - case 1: return new BookListFragment(); + case 0: return new MovieContainerFragment(); + case 1: return new BookContainerFragment(); default: return new NoteListFragment(); } } @@ -100,4 +66,12 @@ public class FragmentHome extends Fragment { return 3; } } + + @Override + public void onDestroyView() { + super.onDestroyView(); + if (viewPagerMain != null) { + viewPagerMain.setAdapter(null); + } + } } \ No newline at end of file diff --git a/app/src/main/java/top/iletter/lvnote/FragmentProfile.java b/app/src/main/java/top/iletter/lvnote/FragmentProfile.java index 2c2d94e..54a798f 100644 --- a/app/src/main/java/top/iletter/lvnote/FragmentProfile.java +++ b/app/src/main/java/top/iletter/lvnote/FragmentProfile.java @@ -11,10 +11,8 @@ import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; public class FragmentProfile extends Fragment { - - public FragmentProfile() { - // Required empty public constructor - } + // ✅ 必须有无参构造函数 + public FragmentProfile() {} @Nullable @Override @@ -27,12 +25,9 @@ public class FragmentProfile extends Fragment { @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); - - // 安全地操作 View TextView movieCount = view.findViewById(R.id.tv_movie_count); TextView bookCount = view.findViewById(R.id.tv_book_count); - - if (movieCount != null) movieCount.setText("14"); + if (movieCount != null) movieCount.setText("24"); if (bookCount != null) bookCount.setText("18"); } } \ No newline at end of file diff --git a/app/src/main/java/top/iletter/lvnote/MainActivity.java b/app/src/main/java/top/iletter/lvnote/MainActivity.java index 6ef4d42..09ee3c8 100644 --- a/app/src/main/java/top/iletter/lvnote/MainActivity.java +++ b/app/src/main/java/top/iletter/lvnote/MainActivity.java @@ -1,66 +1,61 @@ package top.iletter.lvnote; import android.os.Bundle; -import android.widget.Toast; - -import androidx.activity.EdgeToEdge; -import androidx.appcompat.app.AppCompatActivity; -import androidx.core.graphics.Insets; -import androidx.core.view.ViewCompat; -import androidx.core.view.WindowInsetsCompat; -import androidx.fragment.app.Fragment; - -import com.google.android.material.bottomappbar.BottomAppBar; -import com.google.android.material.floatingactionbutton.FloatingActionButton; - -import android.os.Bundle; -import android.view.View; import android.widget.ImageButton; import android.widget.Toast; +import androidx.appcompat.app.AppCompatActivity; +import androidx.fragment.app.Fragment; + +import com.google.android.material.floatingactionbutton.FloatingActionButton; + public class MainActivity extends AppCompatActivity { - private FragmentHome homeFragment = new FragmentHome(); - private FragmentProfile profileFragment = new FragmentProfile(); - private Fragment currentFragment = homeFragment; + private FragmentHome homeFragment; + private FragmentProfile profileFragment; + private Fragment currentFragment; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); - // 初始化默认显示主页 + // ✅ 一次性创建 Fragment,永不销毁 if (savedInstanceState == null) { + homeFragment = new FragmentHome(); + profileFragment = new FragmentProfile(); + getSupportFragmentManager().beginTransaction() - .replace(R.id.fragment_container, homeFragment) + .add(R.id.fragment_container, homeFragment, "home") // 添加主页 + .add(R.id.fragment_container, profileFragment, "profile") // 添加我的 + .hide(profileFragment) // 默认隐藏"我的" .commit(); + currentFragment = homeFragment; + } else { + // 从 savedInstanceState 恢复(横竖屏切换等场景) + homeFragment = (FragmentHome) getSupportFragmentManager().findFragmentByTag("home"); + profileFragment = (FragmentProfile) getSupportFragmentManager().findFragmentByTag("profile"); + currentFragment = homeFragment; } - // 左按钮:主页 + // 底部导航按钮 ImageButton btnHome = findViewById(R.id.btn_home); btnHome.setOnClickListener(v -> switchFragment(homeFragment)); - // 右按钮:我的 ImageButton btnProfile = findViewById(R.id.btn_profile); btnProfile.setOnClickListener(v -> switchFragment(profileFragment)); - // 中间按钮:添加 FloatingActionButton fabAdd = findViewById(R.id.fab_add); - fabAdd.setOnClickListener(v -> { - // TODO: 跳转到新增页面 - Toast.makeText(this, "点击了添加按钮", Toast.LENGTH_SHORT).show(); - }); + fabAdd.setOnClickListener(v -> + Toast.makeText(this, "点击了添加按钮", Toast.LENGTH_SHORT).show() + ); } + // ✅ 核心修复:用 show()/hide() 替代 replace() private void switchFragment(Fragment targetFragment) { if (currentFragment != targetFragment) { getSupportFragmentManager().beginTransaction() - .setCustomAnimations( - android.R.anim.fade_in, - android.R.anim.fade_out, - android.R.anim.fade_in, - android.R.anim.fade_out - ) - .replace(R.id.fragment_container, targetFragment) + .hide(currentFragment) // 隐藏当前 + .show(targetFragment) // 显示目标 .commit(); currentFragment = targetFragment; } diff --git a/app/src/main/java/top/iletter/lvnote/MediaAdapter.java b/app/src/main/java/top/iletter/lvnote/MediaAdapter.java deleted file mode 100644 index 25c296d..0000000 --- a/app/src/main/java/top/iletter/lvnote/MediaAdapter.java +++ /dev/null @@ -1,52 +0,0 @@ -package top.iletter.lvnote; - -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.TextView; - -import androidx.annotation.NonNull; -import androidx.recyclerview.widget.RecyclerView; - -import java.util.List; - -public class MediaAdapter extends RecyclerView.Adapter { - - private final List items; - - public MediaAdapter(List items) { - this.items = items; - } - - @NonNull - @Override - public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { - View view = LayoutInflater.from(parent.getContext()) - .inflate(R.layout.item_media, parent, false); - return new ViewHolder(view); - } - - @Override - public void onBindViewHolder(@NonNull ViewHolder holder, int position) { - String[] parts = items.get(position).split(" · "); - holder.title.setText(parts[0]); - holder.meta.setText(parts.length > 1 ? parts[1] + " · " + parts[2] : ""); - holder.rating.setText(position % 3 == 0 ? "9.7" : position % 3 == 1 ? "9.2" : "8.9"); - } - - @Override - public int getItemCount() { - return items.size(); - } - - static class ViewHolder extends RecyclerView.ViewHolder { - TextView title, meta, rating; - - ViewHolder(View itemView) { - super(itemView); - title = itemView.findViewById(R.id.tv_title); - meta = itemView.findViewById(R.id.tv_meta); - rating = itemView.findViewById(R.id.tv_rating); - } - } -} \ No newline at end of file diff --git a/app/src/main/java/top/iletter/lvnote/MediaListFragment.java b/app/src/main/java/top/iletter/lvnote/MediaListFragment.java deleted file mode 100644 index e45e534..0000000 --- a/app/src/main/java/top/iletter/lvnote/MediaListFragment.java +++ /dev/null @@ -1,89 +0,0 @@ -package top.iletter.lvnote; - -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.recyclerview.widget.LinearLayoutManager; -import androidx.recyclerview.widget.RecyclerView; - -import java.util.ArrayList; -import java.util.List; - -public class MediaListFragment extends Fragment { - - private static final String ARG_STATUS = "status"; - private String status; - - public static MediaListFragment newInstance(String status) { - MediaListFragment fragment = new MediaListFragment(); - Bundle args = new Bundle(); - args.putString(ARG_STATUS, status); - fragment.setArguments(args); - return fragment; - } - - @Override - public void onCreate(@Nullable Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - if (getArguments() != null) { - status = getArguments().getString(ARG_STATUS); - } - } - - @Nullable - @Override - public View onCreateView(@NonNull LayoutInflater inflater, - @Nullable ViewGroup container, - @Nullable Bundle savedInstanceState) { - return inflater.inflate(R.layout.fragment_media_list, container, false); - } - - @Override - public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { - super.onViewCreated(view, savedInstanceState); - - RecyclerView recyclerView = view.findViewById(R.id.recycler_media); - recyclerView.setLayoutManager(new LinearLayoutManager(requireContext())); - - // 模拟数据(根据状态返回不同假数据) - List items = generateFakeData(status); - MediaAdapter adapter = new MediaAdapter(items); - recyclerView.setAdapter(adapter); - } - - private List generateFakeData(String status) { - List data = new ArrayList<>(); - switch (status) { - case "watched": - data.add("肖申克的救赎 · 弗兰克·德拉邦特 · 1994"); - data.add("阿甘正传 · 罗伯特·泽米吉斯 · 1994"); - data.add("盗梦空间 · 克里斯托弗·诺兰 · 2010"); - break; - case "watching": - data.add("权力的游戏 S08 · HBO · 2019"); - data.add("怪奇物语 S04 · Netflix · 2022"); - break; - case "plan_to_watch": - data.add("奥本海默 · 克里斯托弗·诺兰 · 2023"); - data.add("沙丘2 · 丹尼斯·维伦纽瓦 · 2024"); - break; - case "read": - data.add("三体 · 刘慈欣 · 2006"); - data.add("活着 · 余华 · 1993"); - break; - case "reading": - data.add("人类简史 · 尤瓦尔·赫拉利 · 2011"); - break; - case "plan_to_read": - data.add("百年孤独 · 加西亚·马尔克斯 · 1967"); - data.add("追风筝的人 · 卡勒德·胡赛尼 · 2003"); - break; - } - return data; - } -} \ No newline at end of file diff --git a/app/src/main/java/top/iletter/lvnote/MovieAdapter.java b/app/src/main/java/top/iletter/lvnote/MovieAdapter.java new file mode 100644 index 0000000..f1d391c --- /dev/null +++ b/app/src/main/java/top/iletter/lvnote/MovieAdapter.java @@ -0,0 +1,59 @@ +package top.iletter.lvnote; + +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import java.util.List; + +public class MovieAdapter extends RecyclerView.Adapter { + private final List movies; + + public MovieAdapter(List movies) { + this.movies = movies; + } + + @NonNull + @Override + public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(parent.getContext()) + .inflate(R.layout.item_movie, parent, false); + return new ViewHolder(view); + } + + @Override + public void onBindViewHolder(@NonNull ViewHolder holder, int position) { + MovieStatusFragment.MovieItem movie = movies.get(position); + holder.title.setText(movie.title); + holder.directors.setText("导演:" + movie.directors); + holder.actors.setText("主演:" + movie.actors); + holder.duration.setText(movie.duration); + holder.region.setText(movie.region); + holder.year.setText(movie.year); + holder.rating.setText(movie.rating > 0 ? String.valueOf(movie.rating) : "--"); + } + + @Override + public int getItemCount() { + return movies.size(); + } + + static class ViewHolder extends RecyclerView.ViewHolder { + TextView title, directors, actors, duration, region, year, rating; + + ViewHolder(View itemView) { + super(itemView); + title = itemView.findViewById(R.id.tv_title); + directors = itemView.findViewById(R.id.tv_directors); + actors = itemView.findViewById(R.id.tv_actors); + duration = itemView.findViewById(R.id.tv_duration); + region = itemView.findViewById(R.id.tv_region); + year = itemView.findViewById(R.id.tv_year); + rating = itemView.findViewById(R.id.tv_rating); + } + } +} \ No newline at end of file diff --git a/app/src/main/java/top/iletter/lvnote/MovieContainerFragment.java b/app/src/main/java/top/iletter/lvnote/MovieContainerFragment.java new file mode 100644 index 0000000..541d661 --- /dev/null +++ b/app/src/main/java/top/iletter/lvnote/MovieContainerFragment.java @@ -0,0 +1,102 @@ +package top.iletter.lvnote; + +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.fragment.app.FragmentActivity; +import androidx.viewpager2.adapter.FragmentStateAdapter; +import androidx.viewpager2.widget.ViewPager2; + +import com.google.android.material.button.MaterialButtonToggleGroup; + +public class MovieContainerFragment extends Fragment { + private ViewPager2 viewPager; + private MaterialButtonToggleGroup toggleGroup; + + @Nullable + @Override + public View onCreateView(@NonNull LayoutInflater inflater, + @Nullable ViewGroup container, + @Nullable Bundle savedInstanceState) { + return inflater.inflate(R.layout.fragment_movie_container, container, false); + } + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + + viewPager = view.findViewById(R.id.view_pager_movies); + // ✅ 修复:传入 requireActivity() + viewPager.setAdapter(new MoviePagerAdapter(requireActivity())); + + toggleGroup = view.findViewById(R.id.toggle_movies); + + // 按钮点击 → 切换 ViewPager + toggleGroup.addOnButtonCheckedListener((group, checkedId, isChecked) -> { + if (isChecked) { + int position = getPositionByButtonId(checkedId); + viewPager.setCurrentItem(position, true); + } + }); + + // ViewPager 滑动 → 更新按钮选中状态 + viewPager.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() { + @Override + public void onPageSelected(int position) { + super.onPageSelected(position); + int buttonId = getButtonIdByPosition(position); + toggleGroup.check(buttonId); + } + }); + } + + // ✅ 修复:改用 if-else(避免 R.id 非常量问题) + private int getPositionByButtonId(int buttonId) { + if (buttonId == R.id.btn_watched) return 0; + if (buttonId == R.id.btn_watching) return 1; + return 2; // btn_plan + } + + private int getButtonIdByPosition(int position) { + if (position == 0) return R.id.btn_watched; + if (position == 1) return R.id.btn_watching; + return R.id.btn_plan; + } + + // ✅ 修复:适配器接收 FragmentActivity + static class MoviePagerAdapter extends FragmentStateAdapter { + public MoviePagerAdapter(@NonNull FragmentActivity activity) { + super(activity); + } + + @NonNull + @Override + public Fragment createFragment(int position) { + String status = position == 0 ? "watched" : + position == 1 ? "watching" : "plan_to_watch"; + return MovieStatusFragment.newInstance(status); + } + + @Override + public int getItemCount() { + return 3; + } + } + + // ✅ 清理资源 + @Override + public void onDestroyView() { + super.onDestroyView(); + if (viewPager != null) { + viewPager.setAdapter(null); + } + if (toggleGroup != null) { + toggleGroup.clearChecked(); + } + } +} \ No newline at end of file diff --git a/app/src/main/java/top/iletter/lvnote/MovieListFragment.java b/app/src/main/java/top/iletter/lvnote/MovieListFragment.java deleted file mode 100644 index c7da612..0000000 --- a/app/src/main/java/top/iletter/lvnote/MovieListFragment.java +++ /dev/null @@ -1,68 +0,0 @@ -package top.iletter.lvnote; - -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.viewpager2.adapter.FragmentStateAdapter; -import androidx.viewpager2.widget.ViewPager2; - -import com.google.android.material.tabs.TabLayout; -import com.google.android.material.tabs.TabLayoutMediator; - -public class MovieListFragment extends Fragment { - - @Nullable - @Override - public View onCreateView(@NonNull LayoutInflater inflater, - @Nullable ViewGroup container, - @Nullable Bundle savedInstanceState) { - return inflater.inflate(R.layout.fragment_movie_list, container, false); - } - - @Override - public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { - super.onViewCreated(view, savedInstanceState); - - ViewPager2 viewPagerSecondary = view.findViewById(R.id.view_pager_secondary); - viewPagerSecondary.setAdapter(new SecondaryPagerAdapter(this)); - - // 获取父 Fragment 的二级 TabLayout - TabLayout tabSecondary = requireActivity().findViewById(R.id.tab_secondary); - tabSecondary.setVisibility(View.VISIBLE); - - // 绑定二级导航 - new TabLayoutMediator(tabSecondary, viewPagerSecondary, (tab, position) -> { - switch (position) { - case 0: tab.setText("看过"); break; - case 1: tab.setText("正在看"); break; - case 2: tab.setText("准备看"); break; - } - }).attach(); - } - - // 二级 ViewPager2 适配器(三个状态页面) - static class SecondaryPagerAdapter extends FragmentStateAdapter { - public SecondaryPagerAdapter(@NonNull Fragment fragment) { - super(fragment); - } - - @NonNull - @Override - public Fragment createFragment(int position) { - return MediaListFragment.newInstance( - position == 0 ? "watched" : - position == 1 ? "watching" : "plan_to_watch" - ); - } - - @Override - public int getItemCount() { - return 3; - } - } -} \ No newline at end of file diff --git a/app/src/main/java/top/iletter/lvnote/MovieStatusFragment.java b/app/src/main/java/top/iletter/lvnote/MovieStatusFragment.java new file mode 100644 index 0000000..4d54075 --- /dev/null +++ b/app/src/main/java/top/iletter/lvnote/MovieStatusFragment.java @@ -0,0 +1,107 @@ +package top.iletter.lvnote; + +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import java.util.ArrayList; +import java.util.List; + +public class MovieStatusFragment extends Fragment { + private static final String ARG_STATUS = "status"; + private String status; + + public static MovieStatusFragment newInstance(String status) { + MovieStatusFragment fragment = new MovieStatusFragment(); + Bundle args = new Bundle(); + args.putString(ARG_STATUS, status); + fragment.setArguments(args); + return fragment; + } + + @Override + public void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + if (getArguments() != null) { + status = getArguments().getString(ARG_STATUS); + } + } + + @Nullable + @Override + public View onCreateView(@NonNull LayoutInflater inflater, + @Nullable ViewGroup container, + @Nullable Bundle savedInstanceState) { + return inflater.inflate(R.layout.fragment_movie_status, container, false); + } + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + + RecyclerView recyclerView = view.findViewById(R.id.recycler_movies); + TextView tvEmpty = view.findViewById(R.id.tv_empty); + recyclerView.setLayoutManager(new LinearLayoutManager(requireContext())); + + List items = generateFakeMovies(status); + if (items.isEmpty()) { + tvEmpty.setVisibility(View.VISIBLE); + recyclerView.setVisibility(View.GONE); + } else { + tvEmpty.setVisibility(View.GONE); + recyclerView.setVisibility(View.VISIBLE); + recyclerView.setAdapter(new MovieAdapter(items)); + } + } + + private List generateFakeMovies(String status) { + List movies = new ArrayList<>(); + switch (status) { + case "watched": + movies.add(new MovieItem("肖申克的救赎", "弗兰克·德拉邦特", + "蒂姆·罗宾斯, 摩根·弗里曼", "142min", "美国", "1994", 9.7f)); + movies.add(new MovieItem("阿甘正传", "罗伯特·泽米吉斯", + "汤姆·汉克斯, 罗宾·怀特", "142min", "美国", "1994", 9.5f)); + movies.add(new MovieItem("盗梦空间", "克里斯托弗·诺兰", + "莱昂纳多·迪卡普里奥", "148min", "美国", "2010", 9.3f)); + break; + case "watching": + movies.add(new MovieItem("奥本海默", "克里斯托弗·诺兰", + "基里安·墨菲, 艾米莉·布朗特", "180min", "美国", "2023", 8.9f)); + movies.add(new MovieItem("沙丘", "丹尼斯·维伦纽瓦", + "提莫西·查拉梅, 赞达亚", "155min", "美国", "2021", 8.0f)); + break; + case "plan_to_watch": + movies.add(new MovieItem("沙丘2", "丹尼斯·维伦纽瓦", + "提莫西·查拉梅, 赞达亚", "166min", "美国", "2024", 0)); + movies.add(new MovieItem("疯狂的麦克斯:狂暴女神", "乔治·米勒", + "安雅·泰勒-乔伊", "140min", "澳大利亚", "2024", 0)); + break; + } + return movies; + } + + public static class MovieItem { + public String title, directors, actors, duration, region, year; + public float rating; + + public MovieItem(String title, String directors, String actors, + String duration, String region, String year, float rating) { + this.title = title; + this.directors = directors; + this.actors = actors; + this.duration = duration; + this.region = region; + this.year = year; + this.rating = rating; + } + } +} \ No newline at end of file diff --git a/app/src/main/java/top/iletter/lvnote/NoteAdapter.java b/app/src/main/java/top/iletter/lvnote/NoteAdapter.java index 0351682..faf2146 100644 --- a/app/src/main/java/top/iletter/lvnote/NoteAdapter.java +++ b/app/src/main/java/top/iletter/lvnote/NoteAdapter.java @@ -11,10 +11,9 @@ import androidx.recyclerview.widget.RecyclerView; import java.util.List; public class NoteAdapter extends RecyclerView.Adapter { + private final List notes; - private final List notes; - - public NoteAdapter(List notes) { + public NoteAdapter(List notes) { this.notes = notes; } @@ -28,11 +27,10 @@ public class NoteAdapter extends RecyclerView.Adapter { @Override public void onBindViewHolder(@NonNull ViewHolder holder, int position) { - String note = notes.get(position); - String[] parts = note.split(" · "); - holder.title.setText(parts[0]); - holder.content.setText(parts.length > 1 ? parts[1] : "无内容"); - holder.time.setText("2024-02-09 15:30"); + NoteListFragment.NoteItem note = notes.get(position); + holder.title.setText(note.title); + holder.content.setText(note.content); + holder.time.setText(note.time); } @Override @@ -45,9 +43,9 @@ public class NoteAdapter extends RecyclerView.Adapter { ViewHolder(View itemView) { super(itemView); - title = itemView.findViewById(R.id.tv_note_title); - content = itemView.findViewById(R.id.tv_note_content); - time = itemView.findViewById(R.id.tv_note_time); + title = itemView.findViewById(R.id.tv_title); + content = itemView.findViewById(R.id.tv_content); + time = itemView.findViewById(R.id.tv_time); } } } \ No newline at end of file diff --git a/app/src/main/java/top/iletter/lvnote/NoteListFragment.java b/app/src/main/java/top/iletter/lvnote/NoteListFragment.java index 246941d..d37831e 100644 --- a/app/src/main/java/top/iletter/lvnote/NoteListFragment.java +++ b/app/src/main/java/top/iletter/lvnote/NoteListFragment.java @@ -12,11 +12,10 @@ import androidx.fragment.app.Fragment; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; -import java.util.Arrays; +import java.util.ArrayList; import java.util.List; public class NoteListFragment extends Fragment { - @Nullable @Override public View onCreateView(@NonNull LayoutInflater inflater, @@ -31,24 +30,40 @@ public class NoteListFragment extends Fragment { RecyclerView recyclerView = view.findViewById(R.id.recycler_notes); TextView tvEmpty = view.findViewById(R.id.tv_empty); - recyclerView.setLayoutManager(new LinearLayoutManager(requireContext())); - // 模拟笔记数据(空列表演示空状态) - List notes = Arrays.asList( - "2024-02-09 · 今日观影笔记", - "2024-02-08 · 读书随想", - "2024-02-05 · 生活碎片" - ); - + List notes = generateFakeNotes(); if (notes.isEmpty()) { tvEmpty.setVisibility(View.VISIBLE); recyclerView.setVisibility(View.GONE); } else { tvEmpty.setVisibility(View.GONE); recyclerView.setVisibility(View.VISIBLE); - NoteAdapter adapter = new NoteAdapter(notes); - recyclerView.setAdapter(adapter); + recyclerView.setAdapter(new NoteAdapter(notes)); + } + } + + private List generateFakeNotes() { + List notes = new ArrayList<>(); + notes.add(new NoteItem("观影笔记:肖申克的救赎", + "有些鸟是关不住的,它们的羽毛太鲜亮了。当它们飞走的时候,你心底里知道把它们关起来是一种罪恶,也是一种遗憾。", + "02-09 15:30")); + notes.add(new NoteItem("读书随想:三体", + "给岁月以文明,而不是给文明以岁月。黑暗森林法则揭示了宇宙社会学的残酷真相。", + "02-08 20:15")); + notes.add(new NoteItem("生活碎片", + "济南的冬天,阳光透过梧桐叶洒在市中区的老街上,时间仿佛慢了下来。", + "02-07 09:45")); + return notes; + } + + public static class NoteItem { + public String title, content, time; + + public NoteItem(String title, String content, String time) { + this.title = title; + this.content = content; + this.time = time; } } } \ No newline at end of file diff --git a/app/src/main/res/color/segmented_button_bg.xml b/app/src/main/res/color/segmented_button_bg.xml new file mode 100644 index 0000000..7124547 --- /dev/null +++ b/app/src/main/res/color/segmented_button_bg.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/color/segmented_button_text.xml b/app/src/main/res/color/segmented_button_text.xml new file mode 100644 index 0000000..8fd7062 --- /dev/null +++ b/app/src/main/res/color/segmented_button_text.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_home.xml b/app/src/main/res/drawable/ic_home.xml index d37a4e8..dade337 100644 --- a/app/src/main/res/drawable/ic_home.xml +++ b/app/src/main/res/drawable/ic_home.xml @@ -4,6 +4,8 @@ android:viewportWidth="24" android:viewportHeight="24"> + android:fillColor="@android:color/transparent" + android:pathData="M10,20v-6h4v6h5v-8h3L12,3 2,12h3v8z" + android:strokeColor="?attr/colorOnSurfaceVariant" + android:strokeWidth="2" /> \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_person.xml b/app/src/main/res/drawable/ic_person.xml index 2fe73b8..ff5a3ea 100644 --- a/app/src/main/res/drawable/ic_person.xml +++ b/app/src/main/res/drawable/ic_person.xml @@ -4,6 +4,8 @@ android:viewportWidth="24" android:viewportHeight="24"> + android:fillColor="@android:color/transparent" + 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" + android:strokeColor="?attr/colorOnSurfaceVariant" + android:strokeWidth="2" /> \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index fcde2dd..31d23cc 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -5,29 +5,28 @@ android:layout_width="match_parent" android:layout_height="match_parent"> - + + app:layout_constraintBottom_toTopOf="@id/bottom_nav" /> - + + app:cardElevation="2dp" + app:cardCornerRadius="0dp"> + + + - - \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_book_container.xml b/app/src/main/res/layout/fragment_book_container.xml new file mode 100644 index 0000000..77e6a9b --- /dev/null +++ b/app/src/main/res/layout/fragment_book_container.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_book_list.xml b/app/src/main/res/layout/fragment_book_list.xml deleted file mode 100644 index 75b0b3b..0000000 --- a/app/src/main/res/layout/fragment_book_list.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_media_list.xml b/app/src/main/res/layout/fragment_book_status.xml similarity index 87% rename from app/src/main/res/layout/fragment_media_list.xml rename to app/src/main/res/layout/fragment_book_status.xml index 167aade..c302677 100644 --- a/app/src/main/res/layout/fragment_media_list.xml +++ b/app/src/main/res/layout/fragment_book_status.xml @@ -4,22 +4,22 @@ xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" - android:padding="16dp"> + android:paddingHorizontal="16dp" + android:paddingVertical="12dp"> - - + - - - + app:tabIndicatorColor="?colorPrimary" + app:tabPaddingStart="8dp" + app:tabPaddingEnd="8dp" + app:tabTextAppearance="@style/TextAppearance.Lvnote.Tab.Unselected" + app:tabSelectedTextAppearance="@style/TextAppearance.Lvnote.Tab.Selected" + app:tabRippleColor="@null" + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintStart_toStartOf="parent" /> - + - \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_movie_container.xml b/app/src/main/res/layout/fragment_movie_container.xml new file mode 100644 index 0000000..374cfac --- /dev/null +++ b/app/src/main/res/layout/fragment_movie_container.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_movie_list.xml b/app/src/main/res/layout/fragment_movie_list.xml deleted file mode 100644 index 750d777..0000000 --- a/app/src/main/res/layout/fragment_movie_list.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_movie_status.xml b/app/src/main/res/layout/fragment_movie_status.xml new file mode 100644 index 0000000..17beb3a --- /dev/null +++ b/app/src/main/res/layout/fragment_movie_status.xml @@ -0,0 +1,30 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_note_list.xml b/app/src/main/res/layout/fragment_note_list.xml index 730c6b2..112f4c3 100644 --- a/app/src/main/res/layout/fragment_note_list.xml +++ b/app/src/main/res/layout/fragment_note_list.xml @@ -14,12 +14,11 @@ app:layout_constraintTop_toTopOf="parent" app:layout_constraintBottom_toBottomOf="parent" /> - - \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_profile.xml b/app/src/main/res/layout/fragment_profile.xml index 46e057e..20e5a45 100644 --- a/app/src/main/res/layout/fragment_profile.xml +++ b/app/src/main/res/layout/fragment_profile.xml @@ -9,44 +9,28 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" - android:padding="16dp"> + android:padding="24dp" + android:gravity="center_horizontal"> - - + + + + android:text="Levin" + android:textAppearance="?textAppearanceTitleLarge" + android:layout_marginTop="16dp" /> - - - - - - - - - - + android:gravity="center" + android:layout_marginTop="32dp"> + android:textAppearance="?textAppearanceLabelLarge" + android:layout_marginTop="8dp" /> + android:textAppearance="?textAppearanceLabelLarge" + android:layout_marginTop="8dp" /> diff --git a/app/src/main/res/layout/item_book.xml b/app/src/main/res/layout/item_book.xml new file mode 100644 index 0000000..32f17a1 --- /dev/null +++ b/app/src/main/res/layout/item_book.xml @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_media.xml b/app/src/main/res/layout/item_media.xml deleted file mode 100644 index c71bad8..0000000 --- a/app/src/main/res/layout/item_media.xml +++ /dev/null @@ -1,70 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/item_movie.xml b/app/src/main/res/layout/item_movie.xml new file mode 100644 index 0000000..8f57f69 --- /dev/null +++ b/app/src/main/res/layout/item_movie.xml @@ -0,0 +1,130 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_note.xml b/app/src/main/res/layout/item_note.xml index 790f38e..af90922 100644 --- a/app/src/main/res/layout/item_note.xml +++ b/app/src/main/res/layout/item_note.xml @@ -4,43 +4,52 @@ xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginVertical="4dp" - app:cardElevation="1dp" - app:cardCornerRadius="12dp"> + android:layout_marginVertical="10dp" + app:cardElevation="0dp" + app:cardCornerRadius="12dp" + app:strokeWidth="1px" + app:strokeColor="?colorOutlineVariant"> + android:padding="18dp"> + + + + + + + - - - - \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 5e185c9..1d5ab8f 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -1,5 +1,6 @@ + - + #4157FF #FFFFFF #DDE1FF @@ -10,12 +11,9 @@ #171A2C #7A5573 #FFFFFF - #FFD7F2 - #2F1229 #BA1A1A - #FFFFFF #FFDAD6 - #410002 + #FFFFFF #FEFBFF #1B1B1F #FEFBFF @@ -24,7 +22,4 @@ #46464F #777680 #C7C5D0 - #303033 - #F3F0F4 - #BAC5FF \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 0fd6b88..1c39556 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,19 +1,8 @@ - 已阅 + LvNote 主页 我的 添加 - - 影视 书籍 - - - 看过 - 正在看 - 准备看 - - - 添加影视 - 添加书籍 \ No newline at end of file diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml index 938757f..07fbecd 100644 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -1,7 +1,6 @@ - + + + + + + + + + + + + + + + + #4157FF + @android:color/transparent + \ No newline at end of file