我使用的导航从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?
基本上,我有以下导航图:
我希望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
这是我的代码:
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
新导航组件的拟议实践在I/O中提供,具有以下模板和建议的理念:
典型的应用程序通常具有包含CollapsingToolbar的详细视图.如何在该架构下构建它?
android android-architecture-components android-jetpack android-architecture-navigation
所以,我有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 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
我一直在努力思考将Android服务放在新的Android推荐架构中的位置.我提出了许多可能的解决方案,但我无法决定哪一个是最好的方法.
我做了很多研究,我找不到任何有用的指导方针或教程.我发现关于将服务放置在我的应用程序架构中的唯一提示是@JoseAlcerreca Medium post
理想情况下,ViewModels不应该对Android有任何了解.这提高了可测试性,泄漏安全性和模块化.一般的经验法则是确保ViewModel中没有android.*导入(例如android.arch.*).这同样适用于演示者.
根据这一点,我应该将我的Android服务置于我的架构组件层次结构的顶层,与我的活动和碎片处于同一级别.这是因为Android服务是Android框架的一部分,所以ViewModels不应该知道它们.
现在,我将简要介绍一下我的场景,但只是为了让全景更清晰,而不是因为我想要这个特定场景的答案.
以下是我能想到的3种不同架构:
片段和AndroidService之间共享ViewModel

我很确定我应该将它们放在架构之上并将它们视为一个Activity/Fragment,因为BoundServices是Android Framework的一部分,它们由Android操作系统管理,并且它们与其他活动和片段绑定.在这种情况下,我不知道与LiveData,ViewModels和Activities/Fragments交互的最佳方式是什么.
有些人可能认为它们应该被视为一个数据源(因为在我的情况下,它使用蓝牙从一个规模获取数据),但我不认为这是一个好主意,因为我在上一段中所说的都是特别是因为它在这里所说的:
避免将应用的入口点(如活动, 服务和广播接收器)指定为数据源.相反,它们应该只与其他组件协调以检索与该入口点相关的数据子集.每个应用程序组件都是相当短暂的,具体取决于用户与其设备的交互以及系统的整体当前运行状况.
所以,最后,我的问题是:
我们应该在哪里放置我们的Android(绑定)服务以及它们与其他架构组件的关系?这些替代品中的任何一种都是好方法吗?
android android-service android-architecture android-architecture-components android-jetpack
我正在尝试在 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 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().有没有办法动态更新动作栏标题?
如何在适配器中执行最新的喷气背包“视图绑定”,以自动绑定视图。我没有使用 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-jetpack ×10
android ×9
android-architecture-navigation ×5
kotlin ×3
android-architecture-components ×2
text ×1