Reputation: 111
I have a Navigation drawer and have a problem in switching between fragments in android with kotlin. No error messages appear, but I guess the problem in this peace of code:
private fun selectItemDrawer(menuItem: MenuItem){
var fragment:Fragment? = null
var fragmentClass:Class<*> = when(menuItem.itemId)
{
R.id.first-> FirstFragment::class.java
R.id.second-> SecondFragment::class.java
R.id.third-> ThirdFragment::class.java
R.id.fourth-> FourthFragment::class.java
else -> FirstFragment::class.java
}
try {
fragment = fragmentClass.newInstance() as Fragment
}catch (e:Exception){
e.printStackTrace()
}
var fragmentManager = supportFragmentManager
fragmentManager.beginTransaction()
.replace(R.id.frame,fragment)
.commit()
menuItem.isChecked = true
menuItem.title
drawer_layout.closeDrawers()
}
Could anyone help in this please!
Upvotes: 2
Views: 4835
Reputation: 2094
You can download the full source code from here(Navigation Drawer In Android Kotlin) class MainActivity : AppCompatActivity(), View.OnClickListener {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
init()
}
private fun init() {
tv_home.setText("Home Tab")
tv_title.setText("Home")
ll_about.setOnClickListener(this)
ll_home.setOnClickListener(this)
ll_bookmark.setOnClickListener(this)
ll_help.setOnClickListener(this)
rl_menu.setOnClickListener(this)
rl_header.setOnClickListener(this)
tv_link.setLinkTextColor(Color.parseColor("#000000"));
Linkify.addLinks(tv_link, Linkify.ALL)
}
override fun onBackPressed() {
if (drawer_layout.isDrawerOpen(GravityCompat.START)) {
drawer_layout.closeDrawer(GravityCompat.START)
} else {
super.onBackPressed()
}
}
override fun onClick(p0: View?) {
when (p0?.id) {
R.id.ll_home -> {
drawer_layout.closeDrawer(GravityCompat.START)
tv_home.setText("Home Tab")
tv_title.setText("Home")
}
R.id.ll_about -> {
val browserIntent = Intent(Intent.ACTION_VIEW, Uri.parse("http://deepshikhapuri.blogspot.in/"))
startActivity(browserIntent)
}
R.id.ll_help -> {
drawer_layout.closeDrawer(GravityCompat.START)
tv_home.setText("Help Tab")
tv_title.setText("Help")
}
R.id.ll_bookmark -> {
drawer_layout.closeDrawer(GravityCompat.START)
tv_home.setText("Bookmark Tab")
tv_title.setText("Bookmark")
}
R.id.rl_header -> {
}
R.id.rl_menu -> {
if (drawer_layout.isDrawerOpen(GravityCompat.START)) {
drawer_layout.closeDrawer(GravityCompat.START)
} else {
drawer_layout.openDrawer(GravityCompat.START)
}
}
}
}
}
Thanks!
Upvotes: 0
Reputation: 5251
You have never modified var fragment
value after declaration, so, when you try a fragment transaction
, fragment
variable value is still null
and it will not work.
In your code example, you should do something like below:
try {
fragment = fragmentClass.newInstance() as Fragment //set fragment var with selected case
}catch (e:Exception){
e.printStackTrace()
}
Edit: Because question code update.
Just set your fragment
value directly from your switch
statement:
private fun selectItemDrawer(menuItem: MenuItem) {
var fragment: Fragment = when (menuItem.itemId) {
R.id.first -> FirstFragment()
R.id.second -> SecondFragment()
R.id.third -> ThirdFragment()
R.id.fourth -> FourthFragment()
else -> FirstFragment()
}
var fragmentManager = supportFragmentManager
fragmentManager
.beginTransaction()
.replace(R.id.frame, fragment)
.commit()
menuItem.isChecked = true
menuItem.title
drawer_layout.closeDrawers()
}
Upvotes: 3