hdx*_*ode 4 android android-fragments kotlin
我试图制作一个RecyclerView,它将进入我片段的两个页面之一.这些页面放在NavigationDrawer活动中.目标是创建类似Play商店应用主页的内容.
但是我在运行时的代码片段中发现了一个错误.它说:
java.lang.IllegalStateException: mainMenu must not be null
at com.example.MyApp.app.fragment.MainFragment.onCreate(MainFragment.kt:49)
Run Code Online (Sandbox Code Playgroud)
我一直在看一些SO线程,他们说布局没有正确加载.这导致一些元素没有被链接.另一位在评论中说,问题在于上下文未正确初始化.对我来说情况并非如此(相反,它是RecyclerView).
以下是链接,希望它们可以作为参考.
在对我的代码进行多次检查之后,我发誓我已经把正确的布局放进去了.编辑:我导入了 kotlinx.android.synthetic.main.^ 我放这个标志的包:^ $ {layout}.这是我的一些文件(如果这个帖子太长,请原谅我):
MainActivity.kt : AppCompatActivity() ^ activity_main.*
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// preparing the app bars
setSupportActionBar(toolBar)
// getting ready for the pages
val pagerAdapter = MainPagerAdapter(
supportFragmentManager,
resources.getString(R.string.tab_main),
resources.getString(R.string.tab_chat)
)
pager.adapter = pagerAdapter
// activating tabs
tabLayout.setupWithViewPager(pager)
val toggle = ActionBarDrawerToggle(
this, mainDrawer, toolbar,
R.string.navigation_drawer_open,
R.string.navigation_drawer_close)
mainDrawer.addDrawerListener(toggle)
navView.setNavigationItemSelectedListener(this)
toggle.syncState()
}
Run Code Online (Sandbox Code Playgroud)MainPagerAdapter.kt (fm: FragmentManager, private val page1: String, private val page2: String): FragmentPagerAdapter(fm)
override fun getItem(position: Int): Fragment? {
return when (position) {
0 -> MainFragment()
1 -> ChatFragment()
else -> null
}
}
override fun getCount() = 2
override fun getPageTitle(position: Int): CharSequence? {
return when (position) {
0 -> page1
1 -> page2
else -> null
}
}
Run Code Online (Sandbox Code Playgroud)MainFragment.kt : Fragment() ^ content_main.*
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?)
: View? = inflater.inflate(R.layout.content_main, container)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// this is the error
mainMenu.layoutManager = LinearLayoutManager(this.context)
mainMenu.adapter = MyAdapter(itemList) {
toast("${it.name} selected")
}
}
Run Code Online (Sandbox Code Playgroud)MyAdapter.kt: RecyclerView.Adapter<MyAdapter.MyHolder>() ^ item_custom.view.*(由Antonio Leiva提供)
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int)
= GoodsHolder(parent.inflate(R.layout.item_custom))
override fun getItemCount()
= itemList.size
override fun onBindViewHolder(holder: MyHolder, position: Int)
= holder.bind(itemList[position], listener)
class MyHolder(v: View): RecyclerView.ViewHolder(v){
private val item: Item? = null
private val view = v
fun bind(item: Item, listener: (Item) -> Unit)
= with (itemView) {
imgPic.setImageResource(item.pictureId)
txtName.text = item.name
txtPrice.text = item.price.toString()
setOnClickListener { listener(item) }
}
}
Run Code Online (Sandbox Code Playgroud)content_main.xml
<android.support.constraint.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"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:context="com.example.MyApp.app.activity.MainActivity"
>
<!-- the RecyclerView that caused the runtime error -->
<android.support.v7.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/mainMenu"/>
</android.support.constraint.ConstraintLayout>
Run Code Online (Sandbox Code Playgroud)item_custom.xml(这些代码位于CardView内的LinearLayout内)
<ImageView
android:id="@+id/imgPic"
android:layout_width="match_parent"
android:layout_height="128dp"
app:srcCompat="@drawable/ic_menu_gallery" />
<TextView
android:id="@+id/txtName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Get it while it's hot!"
android:layout_margin="@dimen/margin_small"
android:layout_marginTop="@dimen/margin_medium"
android:maxLines="2"
android:ellipsize="end"
android:textStyle="bold"
/>
<TextView
android:id="@+id/txtPrice"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="$3.000.000"
android:layout_marginLeft="@dimen/margin_small"
android:layout_marginStart="@dimen/margin_small"
android:layout_marginRight="@dimen/margin_small"
android:layout_marginEnd="@dimen/margin_small"
android:layout_marginBottom="@dimen/margin_medium"/>
Run Code Online (Sandbox Code Playgroud)ChatFragment.kt:Fragment()(仅包含onCreateView inflating content_main_chat.xml)
content_main_chat.xml(仅包含TextView)
您尚未在MainFragment.kt文件中初始化RecyclerView .你必须在下面的行之前初始化它:
mainMenu.layoutManager = LinearLayoutManager(this.context)
Run Code Online (Sandbox Code Playgroud)
您可以通过以下行初始化RecyclerView:
var mainMenu = findViewById(R.id.mainMenu) as RecyclerView
Run Code Online (Sandbox Code Playgroud)
你必须根据需要改变它.
| 归档时间: |
|
| 查看次数: |
6005 次 |
| 最近记录: |