小编mar*_*987的帖子

使用导航组件将视图模型范围限定为多个片段(不是活动)

我正在使用导航组件,我希望在几个片段之间共享一个视图模型,但是当我离开片段时应该清除它们(因此没有将它们范围限定到活动中)我试图将一个活动放在多个片段中方法。我已经设法使用多个导航主机实现了这一点,并使用 getParentFragment 将片段范围限定到它,但这只会导致更多的问题不得不将片段包装在其他父片段中,失去后退按钮无缝工作和其他黑客来获得一些应该工作的东西很简单。有没有人有关于如何实现这一目标的好主意?我想知道我是否可以使用 getViewModelStore 的任何东西,鉴于下面的图像,我想将视图模型范围限定为 createCardFragment2 并在它之后的任何内容中使用它(addPredictions、editImageFragment 和其他我没有的)

顺便说一句,我不能只在 mainFragment 视图模型存储上调用 clear,因为这里还有其他不应清除的视图模型,我想我想要一种方法来告诉导航主机我知道的父片段应该是什么不是如果我从 mainFragment 或 cardPreviewFragment 导航,这将是一件事,或者一种使视图模型更新的方法

导航图

android android-fragments android-viewmodel android-jetpack android-jetpack-navigation

24
推荐指数
3
解决办法
7193
查看次数

如何将视图模型范围限定为父片段?

所以我正在使用新的导航组件(具有一个活动原则)并使用共享视图模型在每个片段之间进行通信,但是,我有时需要清除视图模型但我找不到清除它的好地方。但是 tbh 我认为与其试图自己清除它,我真的应该允许框架为我做这件事,但这不是因为视图模型是共享的并限定于活动,但我认为我可以将它们限定为一个父片段,我画了一张图来说明我想要做什么。我的导航流程 所以当我从“Child 1 Child a”导航回来时,我只想清除 2 个视图模型,当前视图模型永远不会被清除,试图通过在片段中调用“this”来获取当前的视图模型,而 getParentFragment 在孩子中没有不行,谁能举个例子?

编辑

看起来我已经在做类似的事情,但在我的情况下它不起作用所以我将添加一些代码,这是我如何访问父片段中的第一个视图模型

model = ViewModelProviders.of(this).get(RequestViewModel.class);
Run Code Online (Sandbox Code Playgroud)

然后在子片段中,我正在这样做

requestViewModel = ViewModelProviders.of(getParentFragment()).get(RequestViewModel.class);
Run Code Online (Sandbox Code Playgroud)

但这并没有保留他们之间的数据,他们都附加了观察者

android viewmodel android-fragments android-architecture-navigation

11
推荐指数
5
解决办法
1万
查看次数

导航组件共享元素转换适用于输入但不适用于弹出

我正在尝试在 2 个片段 BlankFragment 和 BlankFragment2 之间使用共享元素动画。BlankFragment 有一个回收器视图,而 BlankFragment2 是一个详细信息屏幕。他们共享一张图片,而我正在使用新的导航组件。

在 BlankFragment 中,我正在使用共享图像的转换名称构建FragmentNavigator.Extras附加内容并将其传递给我的调用navigate(因为它是一个回收器视图,并且这些需要是唯一的),

在 BlankFragment2 中,我收到此名称,将其设置为我的图像并设置 setSharedElementEnterTransition

结果是进入动画工作正常但退出/返回没有,我试过设置它们而不是设置它们(因为我相信导航组件应该为我处理这个)有人可以帮忙吗?

MainActivity 导航设置

private void setNavigation() {
    navController = Navigation.findNavController(this, R.id.main_fragment);
    NavigationUI.setupActionBarWithNavController(this, navController);
}
Run Code Online (Sandbox Code Playgroud)

处理后退按钮

@Override
public boolean onSupportNavigateUp() {
    return Navigation.findNavController(this, R.id.main_fragment).navigateUp()
        || super.onSupportNavigateUp();
}
Run Code Online (Sandbox Code Playgroud)

空白片段点击

@Override
public void onClick(View view, int position) {

    NavController navController = Navigation.findNavController(recyclerView);

    FragmentNavigator.Extras extras = new FragmentNavigator.Extras.Builder().addSharedElement(view, view.getTransitionName()).build();

    BlankFragmentDirections.ActionBlankFragmentToBlankFragment2 directions = BlankFragmentDirections.actionBlankFragmentToBlankFragment2(view.getTransitionName());

    navController.navigate(directions,extras);

}
Run Code Online (Sandbox Code Playgroud)

BlankFragment2 onCreate 带有返回/退出转换

@Override
public void onCreate(Bundle savedInstanceState) …
Run Code Online (Sandbox Code Playgroud)

android android-transitions material-design shared-element-transition android-jetpack-navigation

11
推荐指数
1
解决办法
2371
查看次数

Android Paging 3 如何过滤、排序和搜索我的数据

我正在尝试实现我正在使用 Room 的分页,我花了很长时间才意识到这一切都为我完成了,但我需要做的是能够过滤搜索并对我的数据进行排序。我想暂时将其保留为 LiveData,以便稍后交换为 Flow。\n我使用此方法来过滤搜索和排序,并且效果非常好,

\n
    @SuppressLint("DefaultLocale")\n    private fun searchAndFilterPokemon(): LiveData<List<PokemonWithTypesAndSpecies>> {\n        return Transformations.switchMap(search) { search ->\n            val allPokemon = repository.searchPokemonWithTypesAndSpecies(search)\n            Transformations.switchMap(filters) { filters ->\n                val pokemon = when {\n                    filters.isNullOrEmpty() -> allPokemon\n                    else -> {\n                        Transformations.switchMap(allPokemon) { pokemonList ->\n                            val filteredList = pokemonList.filter { pokemon ->\n                                pokemon.matches = 0\n                                val filter = filterTypes(pokemon, filters)\n                                filter\n                            }\n                            maybeSortList(filters, filteredList)\n                        }\n                    }\n                }\n                pokemon\n            }\n        }\n    }\n
Run Code Online (Sandbox Code Playgroud)\n

这里有一些切换映射,第一个是响应搜索更新

\n
    var search: MutableLiveData<String> = getSearchState()\n
Run Code Online (Sandbox Code Playgroud)\n

第二个是响应过滤器更新

\n
    val filters: MutableLiveData<MutableSet<String>> …
Run Code Online (Sandbox Code Playgroud)

sorting android android-paging android-paging-3

10
推荐指数
1
解决办法
2万
查看次数

文档引用在集合引用上必须有偶数个段错误

我得到了一个相当简单的错误:

Document references must have an even number of segments.
Run Code Online (Sandbox Code Playgroud)

我知道它告诉我什么以及如何修复它,但是它在集合引用中给了我这个错误。

CollectionReference collectionReference = getFirebaseInstance()
.collection(Constants.USERS)
.document(userId)
.collection(Constants.CONTACTS);
Run Code Online (Sandbox Code Playgroud)

在我的数据库中,路径是 (COLLECTION) < DOCUMENTS > (COLLECTION) < DOCUMENTS > 我试图在 users/{id}/contacts 处获取用户的所有联系人,但它只是抛出这个错误,有什么想法吗?

getFirebaseInstance 是我创建的一种方法,用于始终获取当前

FirebaseFirestore.getInstance();
Run Code Online (Sandbox Code Playgroud)

android firebase google-cloud-firestore

9
推荐指数
1
解决办法
1万
查看次数

Android使用视图模型和实时数据实施搜索

我正在为udacity课程在android中进行一个项目,我目前正在尝试实现搜索功能,同时坚持使用android体系结构组件并使用firestore和room。错误。

因此,我建立了一个数据库存储库,以使我的Firestore和Room数据库保持同步并传递数据。然后,我使用viewmodel和观察者模式(我认为),以便观察者获取数据并查找更改后将其提供给我的适配器(refreshMyList(List)),该适配器填充recyclerview如下所示:

 contactViewModel = ViewModelProviders.of(this).get(ContactsViewModel.class);
 contactViewModel.getAllContacts().observe(this, new 
 Observer<List<DatabaseContacts>>() {
        @Override
        public void onChanged(@Nullable List<DatabaseContacts> 
        databaseContacts) {
            ArrayList<DatabaseContacts> tempList = new ArrayList<>();
            tempList.addAll(databaseContacts);
            contactsAdapter.refreshMyList(tempList);
            if (tempList.size() < 1) {
                results.setVisibility(View.VISIBLE);
            } else {
                results.setVisibility(View.GONE);
            }
        }
    });
Run Code Online (Sandbox Code Playgroud)

我现在想执行数据搜索,我的房间查询都设置好,并且我的数据存储库中有一些方法可以根据搜索字符串获取联系人,但是我似乎无法刷新列表,我已经读过了有什么方法可以像Transformations.switchMap一样?但我似乎无法全神贯注于它的工作原理,谁能帮助我

当前,我正在尝试从异步任务返回结果列表,它曾经返回实时数据,但我getValue()还是一如既往地对其进行了更改null,不确定是否正确,这里是异步:

private static class searchContactByName extends AsyncTask<String, Void, 
ArrayList<DatabaseContacts>> {

    private LiveDatabaseContactsDao mDao;

    searchContactByName(LiveDatabaseContactsDao dao){
        this.mDao = dao;
    }

    @Override
    protected ArrayList<DatabaseContacts> doInBackground(String... params) {
        ArrayList<DatabaseContacts> contactsArrayList = new ArrayList<>();
        mDao.findByName("%" + params[0] + "%"); …
Run Code Online (Sandbox Code Playgroud)

search android observable android-livedata

5
推荐指数
3
解决办法
2976
查看次数

通知消息样式存储消息的位置

所以我正在构建一个消息应用程序,我正在尝试使用 NotificationCompat.MessagingStyle 作为我的通知,它通常适用于一条消息,但添加的每条消息只是替换最后一条消息,而不是显示收到的每条消息,直到清除或查看(期望的结果),看看他们说添加这样的消息的文档

.addMessage(messages[1].getText(), messages[1].getTime(), messages[1].getPerson())
.addMessage(messages[2].getText(), messages[2].getTime(), messages[2].getPerson())
Run Code Online (Sandbox Code Playgroud)

这使我假设他们将这些消息存储在某个数组中,但我不确定在哪里实现这一点,就好像我在同一个类中创建了一个新数组我认为如果将其保存到共享首选项,结果将相同(似乎内存有点重)或者可能在一个包含未读消息的小型数据库中?我已经在我的消息中存储了一个值,以确定它们是否已发送或接收我可以对所有未读消息运行查询填充列表并对其进行迭代,尽管这似乎有点矫枉过正?

更新

仍然没有得到任何结果,试图制作一个消息列表并像这样添加它们,但仍然没有快乐

NotificationCompat.MessagingStyle messagingStyle = new 
NotificationCompat.MessagingStyle(message.getRecipientName());         
messagingStyle.setConversationTitle(
getSmsTodayYestFromMilli(message.getTime_stamp().getTime()));
if (messages != null)
   for(DatabaseMessage dbMessage : messages){         
           messagingStyle.addMessage(dbMessage.getMessage(),
           dbMessage.getTime_stamp().getTime(),dbMessage.getRecipientName());
      }
   }
notificationBuilder.setStyle(messagingStyle);
Run Code Online (Sandbox Code Playgroud)

android push-notification firebase-cloud-messaging

5
推荐指数
2
解决办法
1842
查看次数

使用Flutter驱动程序中的系统后退按钮

如何在集成测试中使用系统后退按钮?

因此,我正在使用Flutter,并正在编写集成测试,在大多数情况下,我可以使用AppBar导航,通过工具提示查找它看起来像这样:

driver.tap(find.byTooltip('Back'));
Run Code Online (Sandbox Code Playgroud)

但是我的一项测试打开了一个网页,打开之后我需要继续进行测试,这意味着我需要按下系统后退按钮,这可能吗?

非常感谢

testing integration-testing driver flutter

5
推荐指数
1
解决办法
426
查看次数

如何在铜锣鼓中使铜杯图标居中?

首先,我尝试使用Center(),顺便说一句,似乎cupertino图标偏离了中心

             IconButton(
              icon: const Icon(
                CupertinoIcons.add_circled,
                color: Colors.black,
              ),
              padding: const EdgeInsets.all(0),
              onPressed: () {}
              ),
Run Code Online (Sandbox Code Playgroud)

将图标直接包装在Center()小部件中不会改变任何东西,这就是它的外观 稍微偏离中心

flutter flutter-cupertino

5
推荐指数
1
解决办法
396
查看次数

使用 diff utils 更新回收器视图适配器,添加项目时无法正常工作

我正在使用 diff utils 来更新我的回收器视图(来自视图模型的实时数据返回一个列表),我有一个项目装饰,它向列表中的最后一个元素添加了大量填充,但 diff utils 正确更新了回收器视图通过调用notifyItemInserted而不是notifyDataSetChanged,装饰仅应用于添加的最后一个元素,因此如果我将一个项目添加到我的回收器视图并调用notify dataset更改了适配器重建,那么我的所有项目最终都会有大量填充所有项目和填充仅在最后一个元素上(这是我想要的),如果我添加相同的项目两次,它会在最后添加之前添加它,例如,如果我有一个 1,2,3 的列表并且我添加在现有 3 之前添加了另外 3 个,所以 1,2,3b,3a,有没有办法对此进行更多控制?

物品装饰

public class PredictionsHorizontalSpaceCardDecoration extends RecyclerView.ItemDecoration {

private final int horizontalSpace;
private final int endSpace;

public PredictionsHorizontalSpaceCardDecoration(int horizontalSpace, int endSpace) {
    this.horizontalSpace = horizontalSpace;
    this.endSpace = endSpace;
}

@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
    Log.d("Deco", "parent child count " + (parent.getChildCount() - 1) + " position " + parent.getChildAdapterPosition(view));
    outRect.right = horizontalSpace;
    outRect.top = horizontalSpace;
    outRect.bottom = horizontalSpace;
    outRect.left …
Run Code Online (Sandbox Code Playgroud)

android android-recyclerview item-decoration android-diffutils

5
推荐指数
1
解决办法
495
查看次数