Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/195.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否可以将androidx导航与onClick数据绑定一起使用,而无需在片段中编写样板代码?_Android_Onclicklistener_Android Databinding_Android Architecture Navigation - Fatal编程技术网

是否可以将androidx导航与onClick数据绑定一起使用,而无需在片段中编写样板代码?

是否可以将androidx导航与onClick数据绑定一起使用,而无需在片段中编写样板代码?,android,onclicklistener,android-databinding,android-architecture-navigation,Android,Onclicklistener,Android Databinding,Android Architecture Navigation,我想通过使用数据绑定来实现,而不是在代码中实现onClick处理程序 我有一个带有livedata元素selectedItemId的列表片段,我想在按下编辑按钮时打开一个对应的细节片段。类似的事情可能发生吗 <layout> <data> <!-- assuming that com.example.MyGeneratedNavigation was generated from .../res/navigatio

我想通过使用数据绑定来实现,而不是在代码中实现
onClick
处理程序

我有一个带有livedata元素
selectedItemId
的列表片段,我想在按下编辑按钮时打开一个对应的细节片段。类似的事情可能发生吗

<layout>
    <data>
        <!-- assuming that com.example.MyGeneratedNavigation was 
             generated from .../res/navigation/my_navigation.xml -->
        <variable name="myNavigation" type"com.example.MyGeneratedNavigation" />
        <variable name="selectedItemId" type"..." />
    </data>

    <LinearLayout ...>
        <Button android:id="@+id/edit" 
           android:onClick="@{() -> myNavigation.onShowDetails(selectedItemId)}" />

    </LinearLayout>

</layout>
不幸的是,从未调用语句
Log.d

如果我在java代码中重命名静态方法
myNavigate
,而不是在布局中,我会得到预期的编译错误,因此数据绑定在语法上是正常的


我用这个导航图

<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/nav_gallery"
app:startDestination="@id/galleryFragment">

<fragment
    android:id="@+id/galleryFragment"
    android:name="de.k3b.androidx.navigationdemo.GalleryFragment"
    android:label="fragment_gallery"
    tools:layout="@layout/fragment_gallery" >
    <action
        android:id="@+id/action_gallery_to_editProperties"
        app:destination="@id/editPropertiesFragment" />
</fragment>
<fragment
    android:id="@+id/editPropertiesFragment"
    android:name="de.k3b.androidx.navigationdemo.EditPropertiesFragment"
    android:label="fragment_edit_properties"
    tools:layout="@layout/fragment_edit_properties" />
</navigation>
应用程序build.gradle

buildscript {
repositories {
    google()
    jcenter()

}
dependencies {
    classpath 'com.android.tools.build:gradle:3.4.0'
    classpath "android.arch.navigation:navigation-safe-args-gradle-plugin:1.0.0"

    // NOTE: Do not place your application dependencies here; they belong
    // in the individual module build.gradle files
}
}

allprojects {
repositories {
    google()
    jcenter()

}
}
apply plugin: 'com.android.application'

android {
    compileSdkVersion 28
    defaultConfig {
        applicationId "de.k3b.androidx.navigationdemo"
        minSdkVersion 15
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        debug {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }

        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    dataBinding.enabled=true

}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'androidx.appcompat:appcompat:1.0.0'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
    implementation 'androidx.legacy:legacy-support-v4:1.0.0'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test:runner:1.1.1'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1'
    implementation 'android.arch.navigation:navigation-fragment:1.0.0'
    implementation 'android.arch.navigation:navigation-ui:1.0.0'
}

当然可以。首先,您应该在navgraph中创建一个连接,然后您可以使用下面的导入和onclick

请注意,我不确定您是否可以在此方法内传递参数

<layout>
    <data>
    <import type="com.rf.comm.R"/>
        <import type="androidx.navigation.Navigation"/>
        <!-- assuming that com.example.MyGeneratedNavigation was 
             generated from .../res/navigation/my_navigation.xml -->
        <variable name="myNavigation" type"com.example.MyGeneratedNavigation" />
        <variable name="selectedItemId" type"..." />
    </data>

    <LinearLayout ...>
        <Button android:id="@+id/edit" 
                        android:onClick="@{view -> Navigation.findNavController(view).navigate(R.id.createServiceFragment)}" />

    </LinearLayout>

</layout>


如果您在询问后不需要通过参数,则无需在片段内创建函数:我的问题是,我还必须在片段中替换:
inflater.inflate(…)
使用
DatabindingUtil.inflate(inflater,…)”,在活动中:
setContentView(…)`使用
DatabindingUtil.setContentView(这,…)
。现在所有这些都在使用参数。感谢洛蒂刚刚为“Android Public Tracker应用程序开发Android Studio Design Tools Navigation Editor”创建了一个错误通知单,它生成了未使用
DatabindingUtil
的片段。您是否设法从布局本身发送了它(与参数一起)是的:点击EditButoon调用静态方法,参数视图和int Resource id如Yeah所述,这是可能的。但我提到的是纯粹在布局中做这些事情
apply plugin: 'com.android.application'

android {
    compileSdkVersion 28
    defaultConfig {
        applicationId "de.k3b.androidx.navigationdemo"
        minSdkVersion 15
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        debug {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }

        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    dataBinding.enabled=true

}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'androidx.appcompat:appcompat:1.0.0'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
    implementation 'androidx.legacy:legacy-support-v4:1.0.0'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test:runner:1.1.1'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1'
    implementation 'android.arch.navigation:navigation-fragment:1.0.0'
    implementation 'android.arch.navigation:navigation-ui:1.0.0'
}
<layout>
    <data>
    <import type="com.rf.comm.R"/>
        <import type="androidx.navigation.Navigation"/>
        <!-- assuming that com.example.MyGeneratedNavigation was 
             generated from .../res/navigation/my_navigation.xml -->
        <variable name="myNavigation" type"com.example.MyGeneratedNavigation" />
        <variable name="selectedItemId" type"..." />
    </data>

    <LinearLayout ...>
        <Button android:id="@+id/edit" 
                        android:onClick="@{view -> Navigation.findNavController(view).navigate(R.id.createServiceFragment)}" />

    </LinearLayout>

</layout>