正常增加模块功能的步骤(针对于mvvm的app,以谷歌模板为例)
✅ 步骤一:确认你的阅读器项目的结构
你的项目现在应该是这种结构:
com.example.myapplication1
├── MainActivity
├── ui
│ ├── reader
│ │ ├── ReaderFragment
│ │ ├── ReaderViewModel
│ └── (其他...)
├── data
│ ├── Book.java
│ ├── Chapter.java
│ └── ...
└── utils
└── TxtFileParser.java
GalleryFragment、SlideshowFragment一般在:
com.example.myapplication1.ui.gallery.GalleryFragment
com.example.myapplication1.ui.slideshow.SlideshowFragment
✅ 步骤二:复制 Gallery 和 Slideshow 到你的项目
如果你的阅读器项目没有 gallery 和 slideshow 目录,
直接复制(或者手动新建)这两个 Fragment 和它们的布局文件。
比如:
ui/gallery/GalleryFragment.javares/layout/fragment_gallery.xmlui/slideshow/SlideshowFragment.javares/layout/fragment_slideshow.xml
✅ 步骤三:在 navigation_graph.xml 中注册两个 Fragment
如果你项目是用 Navigation Component(导航图),
那么打开你的 res/navigation/nav_graph.xml,
手动加上 GalleryFragment 和 SlideshowFragment,像这样:
<fragment
android:id="@+id/nav_gallery"
android:name="com.example.myapplication1.ui.gallery.GalleryFragment"
android:label="Gallery"
tools:layout="@layout/fragment_gallery" />
<fragment
android:id="@+id/nav_slideshow"
android:name="com.example.myapplication1.ui.slideshow.SlideshowFragment"
android:label="Slideshow"
tools:layout="@layout/fragment_slideshow" />
✅ 这样导航图里面就有了 Gallery 和 Slideshow。
✅ 步骤四:在 drawer_menu.xml 加入菜单项(让侧边栏能跳转)
打开你的 res/menu/activity_main_drawer.xml,
加上对应的菜单按钮,比如:
<item
android:id="@+id/nav_gallery"
android:icon="@drawable/ic_menu_gallery"
android:title="Gallery" />
<item
android:id="@+id/nav_slideshow"
android:icon="@drawable/ic_menu_slideshow"
android:title="Slideshow" />
✅ 这样,点开抽屉就能看到这两个按钮。
✅ 步骤五:在 MainActivity 里自动处理跳转(通常已经有了)
如果你的 MainActivity 是标准模板(用 NavigationUI 自动绑定菜单),
通常像这样:
NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment_content_main);
NavigationUI.setupActionBarWithNavController(this, navController, appBarConfiguration);
NavigationUI.setupWithNavController(binding.navView, navController);
那么只要你在 navigation_graph.xml 和 menu 里面配置好了,
点击菜单项就会自动跳转到 GalleryFragment、SlideshowFragment了。
✅ 无需额外代码!
总结 🔥
| 要做的事 | 描述 |
|---|---|
| 1 | 复制 GalleryFragment、SlideshowFragment 代码和布局 |
| 2 | 把 Fragment 注册到 nav_graph.xml |
| 3 | 在 drawer_menu.xml 加菜单按钮 |
| 4 | 确认 MainActivity 已绑定 NavController |
搞定之后,你的阅读器项目就拥有:阅读功能 + 画廊 + 幻灯片,而且切换自然顺滑!
安卓开发的组成 和 MVVM怎么用。
📱 安卓 App 开发的基本组成
一个安卓 App,最基础的组成部分是:
| 组件 | 作用 | 举例 |
|---|---|---|
| Activity | 一个屏幕 | 登录界面、主页 |
| Fragment | Activity 的小模块,页面的一部分 | 列表、详情页 |
| View | UI 组件 | Button、TextView、RecyclerView |
| ViewModel | 管理界面数据(MVVM的V+VM桥梁) | 保存输入的内容、加载网络数据 |
| LiveData | 可观察的数据 | 监听数据变化,自动更新界面 |
| Repository | 数据仓库(负责取数据) | 读数据库、网络请求 |
| Room | 安卓内置数据库(SQLite封装) | 存用户信息、历史记录 |
| Navigation | 页面跳转组件 | 从登录页跳到首页 |
还有别的,比如 Service、BroadcastReceiver,但平时用得最多的就是上面这些。
📐 什么是 MVVM?为什么用它?
MVVM =
- Model(模型):数据,比如书本、章节。
- View(界面):展示UI,比如TextView、RecyclerView。
- ViewModel(视图模型):连接Model和View,中间层,负责提供数据给界面。
🔵 为什么用 MVVM?
- 让数据和界面分开写。
- 界面变化自动更新,不用手动刷新。
- 代码更干净,更好维护,尤其是项目变大时。
🛠️ MVVM在安卓怎么使用?
超简单,我分成 3 步告诉你:
第1步:View层(比如 Fragment / Activity)
- 只管展示界面、监听用户操作。
- 不写太多逻辑,逻辑交给ViewModel。
// 绑定ViewModel
ReaderViewModel viewModel = new ViewModelProvider(this).get(ReaderViewModel.class);
// 观察数据
viewModel.getCurrentBook().observe(getViewLifecycleOwner(), book -> {
textViewTitle.setText(book.getTitle());
});
第2步:ViewModel层(ReaderViewModel)
- 负责拿数据、处理数据,提供给View。
- 用
LiveData包装数据,让界面自动感知变化。
public class ReaderViewModel extends AndroidViewModel {
private final MutableLiveData<Book> currentBook = new MutableLiveData<>();
public LiveData<Book> getCurrentBook() {
return currentBook;
}
public void loadBook(String uriString) {
// 从数据库或文件中加载
Book book = new Book("我的书", uriString);
currentBook.postValue(book); // 自动通知界面
}
}
第3步:Model层(数据层)
- 真正的数据,比如数据库、文件、网络。
- 比如 Book.java、Chapter.java
@Entity
public class Book {
@PrimaryKey(autoGenerate = true)
private int id;
private String title;
private String uri;
// getter / setter...
}
✨ 一个小总结:MVVM整体流动
[用户操作界面] --> 通知 ViewModel
[ViewModel] --> 拿到数据 --> 用LiveData通知 View
[View] --> 自动更新UI
一条链路就这么简单!
🌟 小举例(你的项目里的应用)
比如你在阅读器项目里:
| 层 | 例子 |
|---|---|
| View | ReaderFragment 展示章节标题、阅读内容 |
| ViewModel | ReaderViewModel 负责加载 Book、章节列表、记录进度 |
| Model | Book, Chapter, 还有 BookDao(数据库操作) |
✅ 你ReaderFragment用ViewModel拿数据,显示到界面上。 ✅ 数据库用Room管理Book和Chapter,不直接操作数据库。
🚀 小彩蛋:为什么用 LiveData?
因为它感知生命周期(Activity/Fragment消失就不再更新了), 可以防止内存泄漏,比直接写回调接口安全得多!
要不要我顺便给你画一个ReaderFragment + ReaderViewModel 的MVVM流程图? 看一眼就明白怎么串起来的!📈
要的话告诉我!⚡ (我还能教你怎么一键用 DataBinding,让界面直接绑定数据,不用 findViewById,超酷的~)要继续吗?👀