标签: android-jetpack

是否可以使用Android导航架构组件(Android Jetpack)有条件地设置startDestination?

我使用的导航Android的Jetpack的屏幕之间进行导航.现在我想动态设置startDestination.

我有一个名为MainActivity的Activity和两个Fragments,FragmentA和FragmentB.

var isAllSetUp : Boolean = // It is dynamic and I’m getting this from Preferences.

    If(isAllSetUp)
    {
     // show FragmentA
    }
    else
    {
     //show FragmentB
    }
Run Code Online (Sandbox Code Playgroud)

我想使用Navigation Architecture Component设置上面的流程.目前我使用startDestionation如下所示,但它不符合我的要求.

<navigation xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:app="http://schemas.android.com/apk/res-auto"
   xmlns:tools="http://schemas.android.com/tools"
   android:id="@+id/lrf_navigation"
   app:startDestination="@id/fragmentA">

   <fragment
       android:id="@+id/fragmentA"
       android:name="com.mindinventory.FragmentA"
       android:label="fragment_a"
       tools:layout="@layout/fragment_a" />
</navigation>
Run Code Online (Sandbox Code Playgroud)

是否可以使用Android导航架构组件有条件地设置startDestination?

android android-jetpack android-architecture-navigation

31
推荐指数
3
解决办法
9029
查看次数

如何以编程方式更改导航图的起始目标[Jetpack]

基本上,我有以下导航图:

在此输入图像描述

我希望fragment 2在到达之后将导航图中的起点更改为正确(为了防止fragment 1在按下后退按钮时返回 - 就像启动画面一样).

这是我的代码:

navGraph = navController.getGraph();
navGraph.setStartDestination(R.id.fragment2);
navController.setGraph(navGraph);
Run Code Online (Sandbox Code Playgroud)

但是,显然它不起作用,fragment 1按下后退按钮后又回来了.

我做错了吗?还有其他解决方案吗?

android android-navigation android-jetpack android-architecture-navigation

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

如何在 jetpack compose 中使文本可点击?我还想在选择一次后将其切换为不可点击

这是我的代码:

Text(
    text = "Resend OTP",
    fontSize = 20.sp,
    color =  Textfieldcolor,
    style = TextStyle(textDecoration = TextDecoration.Underline)
)
Run Code Online (Sandbox Code Playgroud)

我希望文本可以点击一次然后禁用。

我该怎么做呢?

text kotlin android-studio android-jetpack android-jetpack-compose

30
推荐指数
2
解决办法
3万
查看次数

导航架构组件 - 具有CollapsingToolbar的详细信息视图

新导航组件的拟议实践在I/O中提供,具有以下模板和建议的理念:

  1. 应用程序的一个活动
  2. 活动包含工具栏和底部导航栏

典型的应用程序通常具有包含CollapsingToolbar的详细视图.如何在该架构下构建它?

  • 将工具栏移动到每个片段XML?
  • 以编程方式实现折叠工具栏?
  • 将细节片段移动到它自己的活动(它可能会使用它自己的深层链接)并"打破"这个哲学?

android android-architecture-components android-jetpack android-architecture-navigation

29
推荐指数
2
解决办法
1339
查看次数

Android Jetpack Compose mutableStateListOf 不进行重组

所以,我有mutableStateListOf一个viewModel

var childTravellersList = mutableStateListOf<TravellersDetails>()
Run Code Online (Sandbox Code Playgroud)

TravellersDetails是一个数据类,有一个名为 的字段error

childTravellersList在 UI 中使用为:

val list = remember{viewModel.childTravellersList}

LazyColumn(state = lazyColumnState) {
    itemsIndexed(list) { index, item ->
        SomeBox(show = if(item.error) true else false)
    }
  }
Run Code Online (Sandbox Code Playgroud)

我在给定的TravellersDetailsviewModel更新中编写了一个函数:errorindexchildTravellersList

fun update(index){
    childTravellersList[index].error = true
}
Run Code Online (Sandbox Code Playgroud)

因此,每当我调用此函数时,列表都应该更新。

这会更新列表,但不会触发 UI 重组。我哪里做错了?

android kotlin android-jetpack android-jetpack-compose

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

如何为导航操作定义默认动画?

我正在使用Android Studio 3.2 Canary 14和导航架构组件.使用此功能,您可以像使用Intent一样定义过渡动画.

但是动画被设置为导航图中动作的属性,如下所示:

<fragment
    android:id="@+id/startScreenFragment"
    android:name="com.example.startScreen.StartScreenFragment"
    android:label="fragment_start_screen"
    tools:layout="@layout/fragment_start_screen" >
  <action
    android:id="@+id/action_startScreenFragment_to_findAddressFragment"
    app:destination="@id/findAddressFragment"
    app:enterAnim="@animator/slide_in_right"
    app:exitAnim="@animator/slide_out_left"
    app:popEnterAnim="@animator/slide_in_left"
    app:popExitAnim="@animator/slide_out_right"/>
</fragment>
Run Code Online (Sandbox Code Playgroud)

为图表中的所有操作定义这一过程非常繁琐!

有没有办法在动作上将一组动画定义为默认值?

我没有运气使用款式.

android android-animation android-jetpack android-architecture-navigation

28
推荐指数
2
解决办法
3610
查看次数

在新的Android推荐架构中,BoundService + LiveData + ViewModel最佳实践

我一直在努力思考将Android服务放在新的Android推荐架构中的位置.我提出了许多可能的解决方案,但我无法决定哪一个是最好的方法.

我做了很多研究,我找不到任何有用的指导方针或教程.我发现关于将服务放置在我的应用程序架构中的唯一提示是@JoseAlcerreca Medium post

理想情况下,ViewModels不应该对Android有任何了解.这提高了可测试性,泄漏安全性和模块化.一般的经验法则是确保ViewModel中没有android.*导入(例如android.arch.*).这同样适用于演示者.

根据这一点,我应该将我的Android服务置于我的架构组件层次结构的顶层,与我的活动和碎片处于同一级别.这是因为Android服务是Android框架的一部分,所以ViewModels不应该知道它们.

现在,我将简要介绍一下我的场景,但只是为了让全景更清晰,而不是因为我想要这个特定场景的答案.

  • 我有一个Android应用程序,其中包含MainActivity,其中包含许多片段,所有这些片段都绑定在BottomNavBar中.
  • 我有一个绑定到myActivity的蓝牙服务及其中一个片段(因为我希望服务与Activty具有相同的生命周期,但我也希望直接从我的片段与它进行交互).
  • 该片段与BluetoothService交互以获取两种类型的信息:
    • 有关蓝牙连接状态的信息.不需要坚持.
    • 来自蓝牙设备的数据(在这种情况下,它是比例,因此重量和身体构成).需要坚持下去.

以下是我能想到的3种不同架构:

AndroidService中的LiveData Android服务范围内的LiveData

  • 具有连接状态和来自蓝牙设备的重量测量值的LiveData位于BluetoothService内.
  • Fragment可以触发BluetoothService中的操作(例如scanDevices)
  • Fragment观察LiveData有关连接的状态并相应地调整UI(例如,如果状态已连接,则启用按钮).
  • Fragment观察新重量测量的LiveData.如果新的权重测量来自BluetoothDevice,则Fragment会告诉自己的ViewModel保存新数据.它通过Repository类完成.

片段和AndroidService之间共享ViewModel 共享ViewModel arch

  • Fragment可以触发BluetoothService中的操作(例如scanDevices)
  • BluetoothService更新共享ViewModel中的蓝牙相关LiveData.
  • Fragment在自己的ViewModel中观察LiveData.

服务ViewModel 服务ViewMOdel拱门

  • Fragment可以触发BluetoothService中的操作(例如scanDevices)
  • BluetoothService在其自己的ViewModel中更新蓝牙相关的LiveData.
  • Fragment在自己的ViewModel和BluetoothService ViewModel中观察LiveData.

我很确定我应该将它们放在架构之上并将它们视为一个Activity/Fragment,因为BoundServices是Android Framework的一部分,它们由Android操作系统管理,并且它们与其他活动和片段绑定.在这种情况下,我不知道与LiveData,ViewModels和Activities/Fragments交互的最佳方式是什么.

有些人可能认为它们应该被视为一个数据源(因为在我的情况下,它使用蓝牙从一个规模获取数据),但我不认为这是一个好主意,因为我在上一段中所说的都是特别是因为它在这里所说的:

避免将应用的入口点(如活动, 服务和广播接收器)指定为数据源.相反,它们应该只与其他组件协调以检索与该入口点相关的数据子集.每个应用程序组件都是相当短暂的,具体取决于用户与其设备的交互以及系统的整体当前运行状况.

所以,最后,我的问题是:

我们应该在哪里放置我们的Android(绑定)服务以及它们与其他架构组件的关系?这些替代品中的任何一种都是好方法吗?

android android-service android-architecture android-architecture-components android-jetpack

28
推荐指数
1
解决办法
3284
查看次数

Jetpack Compose:所有项目高度相同的行

我正在尝试在 Compose 中实现一个布局,其中水平滚动的项目Row应具有相同的高度,因此较小的项目应调整为行中最大项目的大小。我知道内在大小,但我就是无法让它发挥作用。另外,我不想为 分配固定高度Row,因为 Row 的高度也应该是其最大子可组合项的高度。

这是简化的布局

@Composable
fun Screen(
    modifier: Modifier = Modifier,
) {
    Row(
        modifier = modifier
            .height(IntrinsicSize.Min)
            .horizontalScroll(state = rememberScrollState()),
        horizontalArrangement = Arrangement.spacedBy(10.dp),
    ) {
        Item(
            text = "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy " +
                    "eirmod tempor invidunt ut labore et dolore magna aliquyam"
        )

        Item(
            text = "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy " +
                    "eirmod tempor invidunt …
Run Code Online (Sandbox Code Playgroud)

android android-jetpack android-jetpack-compose

28
推荐指数
4
解决办法
3万
查看次数

使用AndroidX Navigation从Fragment动态ActionBar标题

我正在使用Android Jetpack 的新导航组件.

根Activity设置非常简单:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    setSupportActionBar(toolbar)

    val navController = findNavController(R.id.navigationFragment)
    setupActionBarWithNavController(navController)

    bottomNavigationView.setupWithNavController(navController)
}
Run Code Online (Sandbox Code Playgroud)

当导航图中定义了Fragment的标题时,它很有效.但对于一个片段,我想动态设置标题.

我尝试过,findNavController().currentDestination.label = "Hello world"但它没有做任何事情.

我当然可以使用类似的技巧(activity as? AppCompatActivity)?.supportActionBar?.title = "Hello world",但我觉得它会打破对我有用的魔力setupActionBarWithNavController().有没有办法动态更新动作栏标题?

android android-jetpack android-architecture-navigation

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

如何在适配器中执行最新的喷气背包“视图绑定”,绑定视图?

如何在适配器中执行最新的喷气背包“视图绑定”,以自动绑定视图。我没有使用 findVeiwById 或 Butterknife 或 Kotlin 合成工具???我已经使用了新的视图绑定,并且对于 Activity 和 Fragment 工作正常。在 build.gradle 文件中启用 viewBinding 后,我能够看到 ActivityHomeBinding 和 FragmentHomeBinding 文件。另外,我看到了用于项目 xml 的 ItemListBinding 类,即 item_list.xml。但是如何在recyclerview的adapter中使用这个文件

viewBinding {
        enabled = true
}
Run Code Online (Sandbox Code Playgroud)

主页活动文件

override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityHomeBinding.inflate(layoutInflater)
        setContentView(binding.root)
}
Run Code Online (Sandbox Code Playgroud)

分段

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        binding = FragmentHomeBinding.inflate(inflater, container, false)
        val view = binding.root
        return view
}
Run Code Online (Sandbox Code Playgroud)

Base Adapter:想在这里使用视图绑定。我能够看到 ItemListBinding,但不知道如何使用它。

class BaseAdapter @Inject constructor(
    private val context: Context,
    private val picasso: …
Run Code Online (Sandbox Code Playgroud)

android kotlin android-jetpack android-viewbinding

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