我在约束布局中放入了一个图像和一个不应滚动的标题布局,以及一个滚动视图,其中包含另一个带有一些视图的约束布局。当我尝试调整滚动视图内的约束布局大小时,宽度会相应变化,但高度不会变化。我希望约束布局高度与其滚动视图的高度相匹配,因为我打算为注册表添加更多文本框和按钮。现在两个盒子被挤压并且约束布局高度没有增加。
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
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:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/MistyRose"
android:orientation="vertical"
android:paddingLeft="16dp"
android:paddingTop="16dp"
android:paddingRight="16dp"
android:paddingBottom="16dp">
<ImageView
android:id="@+id/imageView2"
android:layout_width="203dp"
android:layout_height="95dp"
android:layout_marginStart="8dp"
android:layout_marginTop="32dp"
android:layout_marginEnd="8dp"
android:layout_marginBottom="8dp"
android:src="@drawable/logo"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.497"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.0" />
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="70dp"
android:layout_marginStart="8dp"
android:layout_marginTop="32dp"
android:layout_marginEnd="8dp"
android:layout_marginBottom="8dp"
android:text="Register"
android:textColor="@color/Black"
android:textSize="40dp"
android:textStyle="italic"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/imageView2"
app:layout_constraintVertical_bias="0.016" />
<ScrollView
android:id="@+id/scrollView2"
android:layout_width="400dp"
android:layout_height="250dp"
android:layout_marginStart="8dp"
android:layout_marginTop="32dp"
android:layout_marginEnd="8dp"
android:layout_marginBottom="8dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.6"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView"
app:layout_constraintVertical_bias="0.0">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal">
<EditText
android:layout_width="350dp"
android:layout_height="46dp"
android:layout_marginStart="8dp"
android:layout_marginEnd="8dp"
android:background="@drawable/edittext"
android:hint="Name"
android:inputType="text"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent"
tools:layout_editor_absoluteY="12dp" …Run Code Online (Sandbox Code Playgroud) 现在:https : //i.stack.imgur.com/lgdaa.png
我有一个底部导航栏。案例:底部导航栏项菜单的文本未显示在非活动状态时显示。文本仅在选项卡处于活动状态时显示。即使选项卡菜单处于非活动状态,应该显示什么图标标题?
<android.support.design.widget.BottomNavigationView
android:id="@+id/navigation"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:background="?android:attr/windowBackground"
android:theme="@style/BottomNavigationTheme"
app:menu="@menu/menu"/>
Run Code Online (Sandbox Code Playgroud)
和样式:
<style name="BottomNavigationTheme" parent="Theme.AppCompat.Light">
<item name="colorPrimary">@color/tabActive</item>
<item name="android:textColorSecondary">@color/tabInactive</item>
</style>
Run Code Online (Sandbox Code Playgroud) 我正在使用Hilt作为依赖注入管理器重构我的应用程序。\n我有一个构造函数可注入类,构造函数中有两个参数。参数之一是CoroutineDispatcher.
class SubscriptionsLocalDataSource @Inject constructor(\n private val subscriptionsDao: SubscriptionsDao,\n private val dispatcher: CoroutineDispatcher = Dispatchers.IO\n) : SubscriptionsDataSource {\n\n}\nRun Code Online (Sandbox Code Playgroud)\n当我尝试构建应用程序时,出现缺少绑定错误,如下所示:
\n\n\n错误:[Dagger/MissingBinding] kotlinx.coroutines.CoroutineDispatcher 如果没有 @Provides 注释的方法,则无法提供。\n公共抽象静态类 ApplicationC 实现 ApplicationComponent,\n^\nkotlinx.coroutines.CoroutineDispatcher 被注入到\ncom.anagramma.babacodashboard .data.subscriptions.local.SubscriptionsLocalDataSource(\xe2\x80\xa6, 调度程序)\ncom.anagramma.babacodashboard.data.subscriptions.local.SubscriptionsLocalDataSource 被注入\ncom.anagramma.babacodashboard.data.subscriptions.SubscriptionsRepositoryImpl(localDataSource, \xe2\x80\xa6)\ncom.anagramma.babacodashboard.data.subscriptions.SubscriptionsRepositoryImpl 被注入\ncom.anagramma.babacodashboard.di.SubscriptionsModule.bindSubscriptionsRepository(subscriptionsRepositoryImpl)\njavax.inject.Provider<com.anagramma.babacodashboard。 data.subscriptions.SubscriptionsRepository> 注入于\ncom.anagramma.babacodashboard.ui.orders.subscriptions.SubscriptionsViewModel_AssistedFactory(repository, \xe2\x80\xa6)\ncom.anagramma.babacodashboard.ui.orders.subscriptions.SubscriptionsViewModel_AssistedFactory 注入于\ncom.anagramma.babacodashboard.ui.orders.subscriptions.SubscriptionsViewModel_HiltModule.bind(factory)\njava.util.Map<java.lang.String,javax.inject.Provider<androidx.hilt.lifecycle.ViewModelAssistedFactory<? extends androidx.lifecycle.ViewModel>>> 注入于\nandroidx.hilt.lifecycle.ViewModelFactoryModules.ActivityModule.provideFactory(\xe2\x80\xa6, viewModelFactories)\n@dagger.hilt.android.internal.lifecycle.DefaultActivityViewModelFactory java. util.Set<androidx.lifecycle.ViewModelProvider.Factory> 请求于\ndagger.hilt.android.internal.lifecycle.DefaultViewModelFactories.ActivityEntryPoint.getActivityViewModelFactory() [com.anagramma.babacodashboard.BabacoDashboardApplication_HiltComponents.ApplicationC \xe2\x86\x92 com .anagramma.babacodashboard.BabacoDashboardApplication_HiltComponents.ActivityRetainedC \xe2\x86\x92 com.anagramma.babacodashboard.BabacoDashboardApplication_HiltComponents.ActivityC]\n以下其他入口点也依赖于它:\ndagger.hilt.android.internal.lifecycle.DefaultViewModelFactories.FragmentEntryPoint。 getFragmentViewModelFactory() [com.anagramma.babacodashboard.BabacoDashboardApplication_HiltComponents.ApplicationC \xe2\x86\x92 com.anagramma.babacodashboard.BabacoDashboardApplication_HiltComponents.ActivityRetainedC \xe2\x86\x92 com.anagramma.babacodashboard.BabacoDashboardApplication_HiltComponents.ActivityC \xe2\x86\x92 com .anagramma.babacodashboard.BabacoDashboardApplication_HiltComponents.FragmentC]
\n
我是否缺少 CoroutineDispatcher 上的一些注释?
\n我正在尝试实现以下单例模式: SingletonClass.getInstance(context).callMethod()
虽然有很多教程可以解释如何在Kotlin中制作单例,但它们都没有解决context在静态字段中持有一个会导致Android内存泄漏的事实.
如何在不创建内存泄漏的情况下创建上述模式?
更新:
这是我对CommonsWare解决方案#2的实现.我用过Koin.
单身人士课程:
class NetworkUtils(val context: Context) {
}
Run Code Online (Sandbox Code Playgroud)
申请类别:
class MyApplication : Application() {
val appModule = module {
single { NetworkUtils(androidContext()) }
}
override fun onCreate() {
super.onCreate()
startKoin(this, listOf(appModule))
}
}
Run Code Online (Sandbox Code Playgroud)
活动类:
class MainActivity : AppCompatActivity() {
val networkUtils : NetworkUtils by inject()
}
Run Code Online (Sandbox Code Playgroud) 我需要澄清一下@ParcelizeKotlin 中的注释。我已经声明了这个枚举类:
@Parcelize
enum class Source : Parcelable {
LIST, MAP
}
Run Code Online (Sandbox Code Playgroud)
该类被注释@Parcelize以实现 Parcelable 接口并且它工作正常,但是当我尝试以意图传递 Parceled 类时,我必须强制重新转换为 Parcelable,否则编译器会给我一个“重载解析歧义” . 错误:
重载解析歧义。所有这些功能都匹配。@RecentlyNonNull public open fun putExtra(name: String!, value: Parcelable!): Intent!定义在 android.content.Intent @RecentlyNonNull public open fun putExtra(name: String!, value: Serializable!): Intent! 在 android.content.Intent 中定义
val intent = Intent(context, DestinationActivity::class.java)
intent.putExtra(Constants.RETAIL_DETAILS_CLICK_SOURCE_ID, StoreDetailsClicked.Source
.MAP as Parcelable)
Run Code Online (Sandbox Code Playgroud)
为什么编译器给我这个错误?
我正在使用导航组件,并且正在尝试Fragment使用仪器测试来测试我的组件。该片段具有onViewCreated由扩展函数在方法中初始化的自定义工具栏。
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
tbBlack.init()
}
fun androidx.appcompat.widget.Toolbar.init(
menuId: Int? = null
) {
title = ""
menuId?.let {
inflateMenu(it)
}
findNavController().let {
it.graph.let { graph ->
val configuration = AppBarConfiguration(graph)
setupWithNavController(it, configuration)
}
}
}
Run Code Online (Sandbox Code Playgroud)
在我的仪器测试中的场景初始化期间,由于null导航控制器上的图形导致测试崩溃。
导航控制器在测试中被模拟,以及如下图:
@RunWith(AndroidJUnit4::class)
class LoginFragmentTest {
@Test
fun testEmptyFields() {
val mockNavController = mock(NavController::class.java)
val mockGraph = mock(NavGraph::class.java)
mockNavController.graph = mockGraph
val scenario = launchFragmentInContainer(themeResId = R.style.AppTheme) {
LoginFragment().also { fragment -> …Run Code Online (Sandbox Code Playgroud) android android-testing android-espresso android-architecture-navigation
我想知道是否有更有效的方法在 kotlin 中将字符串转换"yes/no"为布尔值。我的解决方案是在 String 类上定义一个扩展函数,并在 when 表达式中执行 yes no che:
fun String.toBoolean(): Boolean {
when (this.toUpperCase()) {
"YES" -> return true
"NO" -> return false
}
return false
}
Run Code Online (Sandbox Code Playgroud)
还有其他可能的方法吗?
我有一个视图SubEpoxyRecyclerView,它是EpoxyRecyclerView我的父类的子类。当初始化此视图时,超类调用构造函数主体中的EpoxyRecyclerView方法。setItemSpacingPx(Int)
当调用这个方法时,我的类变量都没有被初始化!应用程序在线崩溃,itemDecorator.pxBetweenItems指出该 itemDecorator值为空,这是不可能的
子类(科特林):
class SubEpoxyRecyclerView @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0)
: EpoxyRecyclerView(context, attrs, defStyleAttr) {
private val itemDecorator: Decor = Decor()
private val someInt: Int = 5
private var someBoolean: Boolean = true
override fun setItemSpacingPx(spacingPx: Int) {
// Called from superclass. Debug: itemDecorator is null,
// someInt is 0, someBoolean is false
removeItemDecoration(itemDecorator)
itemDecorator.pxBetweenItems = spacingPx
if (spacingPx > 0) {
addItemDecoration(itemDecorator) …Run Code Online (Sandbox Code Playgroud) 我是 kotlin 的新手,我正在为我定义的自定义类处理运算符重载。该类称为“有理数”,表示一个有理数,例如 117/1098。类定义如下,我重载了一堆运算符,如加号、减号、时间等。但是我不确定我必须做什么来重载“in”运算符。
这是我的课:
data class Rational(val rational: String) {
private val numerator: BigInteger
private val denominator: BigInteger
init {
val splitted = rational.split("/")
numerator = splitted[0].toBigInteger()
denominator = when (splitted[1]) {
"0" -> throw Exception("not allowed")
else -> splitted[1].toBigInteger()
}
}
operator fun plus(number: Rational): Rational {
val gcm = denominator * number.denominator
val numerator = (gcm / denominator) * numerator + (gcm / number.denominator) * number.numerator
return Rational("$numerator/$gcm")
}
operator fun minus(number: Rational): Rational {
val gcm …Run Code Online (Sandbox Code Playgroud) 如何将以下代码从 Java 转换为 Kotlin?
Boolean mBoolean = false
view.setVisibility(mBoolean ? View.VISIBLE : View.GONE);
Run Code Online (Sandbox Code Playgroud) android ×8
kotlin ×7
android-architecture-navigation ×1
android-view ×1
dagger-hilt ×1
enums ×1
equivalent ×1
java ×1
parcel ×1
parcelable ×1
scrollview ×1
singleton ×1
syntax ×1
xml ×1