Jos*_*iro 17 android android-fragments kotlin-android-extensions
有一个相当简单的场景给我带来了很多麻烦.我正在使用嵌入式片段制作一个非常简单的Activity.这个片段只是一个显示一些图像的Gridview.当引用使用Kotlin扩展的Gridview直接引用XML id时会出现问题.这是什么问题?kotlinx不能用于静态片段吗?
错误:
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.android.android_me/com.example.android.android_me.ui.MainActivity}: java.lang.IllegalStateException: gridview_all_parts must not be null
Caused by: java.lang.IllegalStateException: gridview_all_parts must not be null at com.example.android.android_me.ui.MasterListFragment.onActivityCreated(MasterListFragment.kt:22)
Run Code Online (Sandbox Code Playgroud)
带有令人反感的代码行的片段
import kotlinx.android.synthetic.main.fragment_master_list.*
class MasterListFragment: Fragment() {
override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? {
val layoutView = inflater?.inflate(R.layout.fragment_master_list, container, false)
return layoutView
}
override fun onActivityCreated(savedInstanceState: Bundle?) {
//If this is removed, code runs
gridview_all_parts.adapter = MasterListAdapter(activity, AndroidImageAssets.getAll())
super.onActivityCreated(savedInstanceState)
}
}
Run Code Online (Sandbox Code Playgroud)
片段布局:
<?xml version="1.0" encoding="utf-8"?>
<GridView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/gridview_all_parts"
android:layout_width="match_parent" android:layout_height="match_parent"/>
Run Code Online (Sandbox Code Playgroud)
父活动布局
<?xml version="1.0" encoding="utf-8"?>
<!--have tried both class:= and android:name:=-->
<fragment xmlns:android="http://schemas.android.com/apk/res/android"
class="com.example.android.android_me.ui.MasterListFragment"
android:id="@+id/fragment_masterlist"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
Run Code Online (Sandbox Code Playgroud)
家长活动
class MainActivity: AppCompatActivity(){
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
}
Run Code Online (Sandbox Code Playgroud)
kar*_*ngh 25
要在Fragment中使用扩展,您需要使用您的layoutView.这应该工作:layoutView.gridview_all_parts.adapter = MasterListAdapter(activity, AndroidImageAssets.getAll())
在这种情况下,您可以使layoutView全局化.
更新的解释 它与视图膨胀有关.就像在butterknife中一样,我们需要在fragment/recyclerView的情况下绑定膨胀的视图,类似于kotlin,我们需要使用inflate视图来访问xml中的视图.
引自官方文件,
导入合成属性可以一次导入特定布局的所有窗口小部件属性:
import kotlinx.android.synthetic.main.<layout>.*因此,如果布局文件名是
activity_main.xml,我们将导入kotlinx.android.synthetic.main.activity_main.*.
如果我们想在View上调用合成属性,我们也应该导入
kotlinx.android.synthetic.main.activity_main.view.*.一旦我们这样做,我们就可以调用相应的扩展,这些扩展是以XML文件中的视图命名的属性.
| 归档时间: |
|
| 查看次数: |
8262 次 |
| 最近记录: |