setNavigationItemSelectedListener не работает
Мое NavigationView
onClick
событие не работает.
Вот фрагменты кода, которые я пробовал один за другим, но ничего не сработало:
- Реализация
NavigationView.OnNavigationItemSelectedListener
с помощьюOnClick()
метода Метод настройки
NavigationItemSelectedListener
nav = (NavigationView)findViewById(R.id.nav);
nav.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(MenuItem item) {
Toast.makeText(getApplicationContext(),"Hello",Toast.LENGTH_SHORT).show();
return true;
}
});Использование
OnOptionItemSelected()
метода@Override
public boolean onOptionsItemSelected(MenuItem item) {
if(toggle.onOptionsItemSelected(item))
{
return true;
}
switch (item.getItemId()) {
case R.id.lib:
Toast.makeText(getApplicationContext(),"OK",Toast.LENGTH_SHORT).show();
return true;
case R.id.fav:
Toast.makeText(getApplicationContext(),"OK",Toast.LENGTH_SHORT).show();
return true;
}
return super.onOptionsItemSelected(item);
}
Я также перепробовал все эти вопросы и блоги, имеющие отношение к моему вопросу, но это не сработало.
- Панель навигации: setNavigationItemSelectedListener не работает.
- https://javalang.ru/questions/47242960/navigationview-setnavigationitemselectedlistener
- onNavigationItemSelected не работает в NavigationView
Вот мой полный MainActivity.java файл:
public class MainActivity extends AppCompatActivity{
public frag_song song;
public frag_artist artist;
public frag_album album;
public TabLayout tab;
Uri songUri;
Cursor songCursor;
public static LinearLayout mainLayout;
int songTitle,songArtist,duration,data,songAlbum;
public NavigationView nav;
public DrawerLayout layout;
public ActionBarDrawerToggle toggle;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ActionBar actionBar = getSupportActionBar();
actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_HOME);
//actionBar.setIcon(R.drawable.logo);
mainLayout = (LinearLayout)findViewById(R.id.main);
//All Stuff Of NAvigatin Drawer
layout = (DrawerLayout)findViewById(R.id.drawerL);
toggle = new ActionBarDrawerToggle(MainActivity.this,layout,R.string.open,R.string.close);
layout.addDrawerListener(toggle);
toggle.syncState();
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
nav = (NavigationView)findViewById(R.id.nav);
nav.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(MenuItem item) {
Toast.makeText(getApplicationContext(),"Hello",Toast.LENGTH_SHORT).show();
return true;
}
});//Not Working
nav.setItemIconTintList(null);
//check if app open first time or not
SharedPreferences prefs = this.getSharedPreferences("com.blackhat.rhythmbox", Context.MODE_PRIVATE);
Boolean first = prefs.getBoolean("first", true);
if(first){
//Adding song To Database
addtoDatabase();
prefs.edit().putBoolean("first",false).commit();
}
//Decaring Object of Fragment
//TO access Tab
tab = (TabLayout)findViewById(R.id.tabs);
song = new frag_song();
artist = new frag_artist();
album = new frag_album();
//addding tab to tab layout
tab.addTab(tab.newTab().setText("Songs"),true);
tab.addTab(tab.newTab().setText("ALbum"));
tab.addTab(tab.newTab().setText("Artist"));
tab.getTabAt(0).setIcon(R.drawable.icons_song);
tab.getTabAt(1).setIcon(R.drawable.icons_album);
tab.getTabAt(2).setIcon(R.drawable.icon_artist);
//setting default tab
FragmentManager fm = getSupportFragmentManager();
fm.beginTransaction().replace(R.id.frame_container,song).commit();
//on tab select
tab.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
switch (tab.getPosition())
{
case 0 :
FragmentManager f_song = getSupportFragmentManager();
f_song.beginTransaction().replace(R.id.frame_container,song).commit();
break;
case 1 :
FragmentManager f_artist = getSupportFragmentManager();
f_artist.beginTransaction().replace(R.id.frame_container,album).commit();
break;
case 2 :
FragmentManager f_album = getSupportFragmentManager();
f_album.beginTransaction().replace(R.id.frame_container,artist).commit();
break;
}
}
@Override
public void onTabUnselected(TabLayout.Tab tab) {
}
@Override
public void onTabReselected(TabLayout.Tab tab) {
}
});
}
@Override
protected void onStop() {
super.onStop();
}
public void addtoDatabase(){
song_db dbHelper = new song_db(getApplicationContext());
SQLiteDatabase db = dbHelper.getWritableDatabase();
ContentValues contentValues = new ContentValues();
ContentResolver contentResolver = getContentResolver();
songUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
songCursor = contentResolver.query(songUri, null, null, null, null);
//checking if cursor is null or not
if(songCursor !=null && songCursor.moveToFirst()){
songTitle = songCursor.getColumnIndex(MediaStore.Audio.Media.TITLE);
songArtist = songCursor.getColumnIndex(MediaStore.Audio.Media.ARTIST);
duration = songCursor.getColumnIndex(MediaStore.Audio.Media.DURATION);
songAlbum = songCursor.getColumnIndex(MediaStore.Audio.Media.ALBUM);
data = songCursor.getColumnIndex(MediaStore.Audio.Media.DATA);
Toast.makeText(getApplicationContext(),"Loaded",Toast.LENGTH_SHORT).show();
do{
contentValues.put("name",songCursor.getString(songTitle));
contentValues.put("artist",songCursor.getString(songArtist));
contentValues.put("album",songCursor.getString(songAlbum));
contentValues.put("path",songCursor.getString(data));
contentValues.put("duration",songCursor.getString(duration));
contentValues.put("isfavorite",0);
contentValues.put("playlist","regular");
// contentValues.put("name",songCursor.getString(songArtist));
db.insert("songs",null,contentValues);
}while (songCursor.moveToNext());
}
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if(toggle.onOptionsItemSelected(item))
{
return true;
}
return super.onOptionsItemSelected(item);
}
}
Переведено автоматически
Ответ 1
У меня была такая же проблема, и я обнаружил, что Android ОЧЕНЬ разборчив в макете XML. У меня был NavigationView в качестве первого дочернего элемента DrawerLayout , но по какой-то глупой причине он должен быть последним дочерним элементом. Итак, в вашем макете элементы должны располагаться в таком порядке.:
<DrawerLayout>
<FrameLayout/>
<NavigationView/>
</DrawerLayout>
НЕ в таком порядке:
<DrawerLayout>
<NavigationView/>
<FrameLayout/>
</DrawerLayout>
Ответ 2
У меня это сработало, чтобы вывести представление на передний план
navigationView.setNavigationItemSelectedListener(this);
navigationView.bringToFront();
Ответ 3
Если у вас возникают дополнительные проблемы и вы хотите разобраться в элементах панели навигации, создайте новый проект и выберите Макет панели навигации или выполните проверку приведенного ниже кода:
Используйте приведенный ниже код :
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentTransaction;
import android.view.View;
import android.support.design.widget.NavigationView;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;
public class MainActivity extends AppCompatActivity
implements NavigationView.OnNavigationItemSelectedListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
drawer.setDrawerListener(toggle);
toggle.syncState();
NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
navigationView.setNavigationItemSelectedListener(this);
//add this line to display menu1 when the activity is loaded
displaySelectedScreen(R.id.nav_menu1);
}
@Override
public void onBackPressed() {
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
if (drawer.isDrawerOpen(GravityCompat.START)) {
drawer.closeDrawer(GravityCompat.START);
} else {
super.onBackPressed();
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
private void displaySelectedScreen(int itemId) {
//creating fragment object
Fragment fragment = null;
//initializing the fragment object which is selected
switch (itemId) {
case R.id.nav_menu1:
fragment = new Menu1();
break;
case R.id.nav_menu2:
fragment = new Menu2();
break;
case R.id.nav_menu3:
fragment = new Menu3();
break;
}
//replacing the fragment
if (fragment != null) {
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(R.id.content_frame, fragment);
ft.commit();
}
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
drawer.closeDrawer(GravityCompat.START);
}
@SuppressWarnings("StatementWithEmptyBody")
@Override
public boolean onNavigationItemSelected(MenuItem item) {
//calling the method displayselectedscreen and passing the id of selected menu
displaySelectedScreen(item.getItemId());
//make this method blank
return true;
}
}