私のコードは完璧に動作します:Navigation Drawer内の項目がクリックされるたびにその項目が選択されます。
もちろん、デフォルトのフラグメント(ホーム)でアプリを起動したいのですが、Navigation Drawerではアイテムが選択されていません。プログラムでその項目を選択する方法
public class BaseApp extends AppCompatActivity {
//Defining Variables
protected String LOGTAG = "LOGDEBUG";
protected Toolbar toolbar;
protected NavigationView navigationView;
protected DrawerLayout drawerLayout;
private DateManager db = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.base_layout);
navigationView = (NavigationView) findViewById(R.id.navigation_view);
// set the home/dashboard at startup
FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.frame, new DashboardFragment());
fragmentTransaction.commit();
setNavDrawer();
}
private void setNavDrawer(){
// Initializing Toolbar and setting it as the actionbar
toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
//Initializing NavigationView
//Setting Navigation View Item Selected Listener to handle the item click of the navigation menu
navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
// This method will trigger on item Click of navigation menu
@Override
public boolean onNavigationItemSelected(MenuItem menuItem) {
//Checking if the item is in checked state or not, if not make it in checked state
// I THINK THAT I NEED EDIT HERE...
if (menuItem.isChecked()) menuItem.setChecked(false);
else menuItem.setChecked(true);
//Closing drawer on item click
drawerLayout.closeDrawers();
//Check to see which item was being clicked and perform appropriate action
switch (menuItem.getItemId()) {
//Replacing the main content with ContentFragment
case R.id.home:
DashboardFragment dashboardFragment = new DashboardFragment();
FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.frame, dashboardFragment,"DASHBOARD_FRAGMENT");
fragmentTransaction.commit();
return true;
[...]
ここで編集する必要があると思います。
if (menuItem.isChecked()) menuItem.setChecked(false);
else menuItem.setChecked(true);
またはFragmentTransactionを使用したApp起動時のonCreate
内。
ご支援いただきありがとうございます。
以下のコードを使用してください。
navigationView.getMenu().getItem(0).setChecked(true);
setNavDrawer();
を呼び出した後にこのメソッドを呼び出します
getItem(int index)
メソッドはMenuItem
を取得するので、そのMenuItem
に対してsetChecked(true);
を呼び出すことができます。あなたがすることができるのは、どの要素インデックスがデフォルトを持っているかを見つけること、そしてそのインデックスで0を置き換えることです。
あなたが呼び出すことによって項目を選択(強調表示)することができます
onNavigationItemSelected(navigationView.getMenu().getItem(0));
これは参照リンクです: http://thegeekyland.blogspot.com/2015/11/navigation-drawer-how-set-selected-item.html
_ edit _ nexus 4では動作しませんでした。ライブラリリビジョン24.0.0をサポートします。使用をお勧めします
navigationView.setCheckedItem(R.id.nav_item);
下記の@Kingstonが回答しました。
navigationView.setCheckedItem(id);
このメソッドはAPI 23.0.0で導入されました
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:tools="http://schemas.Android.com/tools"
tools:ignore="UnusedIds">
<group
Android:id="@+id/group"
Android:checkableBehavior="single">
<item
Android:id="@+id/menu_nav_home"
Android:icon="@drawable/ic_home_black_24dp"
Android:title="@string/menu_nav_home" />
</group>
</menu>
注:Android:checkableBehavior="single"
this も参照してください。
私にとってこれら二つの方法はうまくいきませんでした:
navigationView.getMenu().getItem(0).setChecked(true);
navigationView.setCheckedItem(id);
これを試してください、それは私のために働きます。
onNavigationItemSelected(navigationView.getMenu().findItem(R.id.nav_profile));
例( NavigationView.OnNavigationItemSelectedListener ):
private void setFirstItemNavigationView() {
navigationView.setCheckedItem(R.id.custom_id);
navigationView.getMenu().performIdentifierAction(R.id.custom_id, 0);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setFirstItemNavigationView();
}
@SuppressWarnings("StatementWithEmptyBody")
@Override
public boolean onNavigationItemSelected(MenuItem item) {
FragmentManager fragmentManager = getFragmentManager();
switch (item.getItemId()) {
case R.id.custom_id:
Fragment frag = new CustomFragment();
// update the main content by replacing fragments
fragmentManager.beginTransaction()
.replace(R.id.viewholder_container, frag)
.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
.addToBackStack(null)
.commit();
break;
}
Tks
Googlesには「おお、すごい」サポートライブラリに関する問題が常にあります。サポートライブラリのバージョンを下げずに項目をチェックしたい場合は、チェック状態を設定する前に単にチェック可能を設定してください。
MenuItem item = drawer.getMenu().findItem(R.id.action_something);
item.setCheckable(true);
item.setChecked(true);
メニューのxmlファイルでチェック可能に設定してもうまくいくかもしれません
次の1ライナーのアイテムを強調表示して選択することができます。
navigationView.getMenu().performIdentifierAction(R.id.posts, 0);
API 23は次のメソッドを提供します。
navigationView.setCheckedItem(R.id.nav_item_id);
ただし、何らかの理由で、この機能によってナビゲーション項目の背後にあるコードが実行されることはありませんでした。このメソッドは確かにナビゲーションドロワの中の項目をハイライトするか、それを「チェック」しますが、起動画面がナビゲーションドロワの選択に依存している場合、起動時にOnNavigationItemSelectedListener
を呼び出さないようです。手動でリスナーを呼び出すことは可能ですが、それはハッキングです:
if (savedInstanceState == null) this.onNavigationItemSelected(navigationView.getMenu().getItem(0));
上記のコードは、次のことを前提としています。
NavigationView.OnNavigationItemSelectedListener
を実装しましたnavigationView.setNavigationItemSelectedListener(this);
これには2つの関数を呼び出さなければなりません。
まず: onNavigationItemSelected
リスナに実装したコマンドを削除します。
onNavigationItemSelected(navigationView.getMenu().getItem(R.id.nav_camera));
秒: ナビゲーションドロワーのメニュー項目の状態を選択済み(またはチェック済み)に変更します。
navigationView.setCheckedItem(R.id.nav_camera);
私は両方の機能を呼び出しました、そしてそれは私のために働きました。
次のコードはメニュー項目を選択するだけです。
navigationView.setCheckedItem(id);
メニュー項目を選択して開くには、上記の行の後に次のコードを追加します。
onNavigationItemSelected(navigationView.getMenu().getItem(0));
これは私の解決策で、とても簡単です。
これが私のmenu.xmlファイルです。
<group
Android:id="@+id/grp1"
Android:checkableBehavior="single">
<item
Android:id="@+id/nav_all_deals"
Android:checked="true"
Android:icon="@drawable/ic_all_deals"
Android:title="@string/all_deals" />
<item
Android:id="@+id/nav_news_and_events"
Android:icon="@drawable/ic_news"
Android:title="@string/news_and_events" />
<item
Android:id="@+id/nav_histories"
Android:icon="@drawable/ic_histories"
Android:title="@string/histories" />
</group>
メニューの上にある場合は、最初のメニュー項目が強調表示されます。下の行で何かができます(例:最初のフラグメントを表示するなど)。注:「引き出しコードの設定」の後に書いてください
onNavigationItemSelected(mNavigationView.getMenu().getItem(0));
まず最初に選択したアイテムの色を作ります。ここで https://stackoverflow.com/a/30594875/1462969 _良い例です。アイコンの色を変えるのに役立ちます。選択したすべてのアイテムの背景を変更するには、values\style.xmlファイルにこれを追加します。
<item name="selectableItemBackground">@drawable/selectable_item_background</item>
Selectable_item_backgroundは、drawable/selectable_item_background.xmlで宣言する必要があります。
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
<item Android:drawable="@color/accent_translucent"
Android:state_pressed="true" />
<item Android:drawable="@Android:color/transparent" />
</selector>
Style.xmlで色を宣言できる場所
<color name="accent_translucent">#80FFEB3B</color>
そしてその後
// The main navigation menu with user-specific actions
mainNavigationMenu_ = (NavigationView) findViewById(R.id.main_drawer);
mainNavigationMenu_.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(MenuItem menuItem) {
mainNavigationMenu_.getMenu().findItem(itemId).setChecked(true);
return true;
}
});
ご覧のとおり、このmainNavigationMenu_.getMenu()。findItem(itemId).setChecked(true);を使用しました。を選んで選択した項目を設定します。こちらnavigationView
<Android.support.design.widget.NavigationView
Android:id="@+id/main_drawer"
Android:layout_width="wrap_content"
Android:layout_height="match_parent"
Android:layout_gravity="start"
app:headerLayout="@layout/header_main_navigation_menu"
app:itemIconTint="@color/state_list"
app:itemTextColor="@color/primary"
app:menu="@menu/main_menu_drawer"/>
最も簡単な方法は、次のようにxmlから選択することです。
<menu>
<group Android:checkableBehavior="single">
<item
Android:checked="true"
Android:id="@+id/nav_home"
Android:icon="@drawable/nav_home"
Android:title="@string/main_screen_title_home" />
Android:checked="true"
という行に注意してください
あなたの活動について(引き出しの後ろ):
@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.addDrawerListener(toggle);
toggle.syncState();
NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
navigationView.setNavigationItemSelectedListener(this);
navigationView.setCheckedItem(R.id.nav_portfolio);
onNavigationItemSelected(navigationView.getMenu().getItem(0));
}
そして
@Override
public boolean onNavigationItemSelected(MenuItem item) {
// Handle navigation view item clicks here.
int id = item.getItemId();
Fragment fragment = null;
if (id == R.id.nav_test1) {
fragment = new Test1Fragment();
displaySelectedFragment(fragment);
} else if (id == R.id.nav_test2) {
fragment = new Test2Fragment();
displaySelectedFragment(fragment);
}
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
drawer.closeDrawer(GravityCompat.START);
return true;
}
そしてあなたのメニューで:
<group Android:checkableBehavior="single">
<item
Android:id="@+id/nav_test1"
Android:title="@string/test1" />
<item
Android:id="@+id/nav_test2"
Android:title="@string/test2" />
</group>
最初のメニューはデフォルトのメニューとして highlight と show です。
Nav Drawerの個人用アイテムのセレクターを作る
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
<item Android:drawable="@color/darkBlue" Android:state_pressed="true"/>
<item Android:drawable="@color/darkBlue" Android:state_checked="true"/>
<item Android:drawable="@color/textBlue" />
</selector>
NavigationViewを少し変更します。
<Android.support.design.widget.NavigationView
Android:id="@+id/nav_view"
Android:layout_width="wrap_content"
Android:layout_height="match_parent"
Android:layout_gravity="start"
Android:fitsSystemWindows="true"
app:itemBackground="@drawable/drawer_item"
Android:background="@color/textBlue"
app:itemIconTint="@color/white"
app:itemTextColor="@color/white"
app:menu="@menu/activity_main_drawer"
/>
以下のコードは、最初の項目を選択し、メニューで選択した最初の項目を強調表示するために使用されます。
onNavigationItemSelected(mNavigationView.getMenu()。getItem(0).setChecked(true));
BottomNavigationView
を使用する場合、navigationView.getMenu().getItem(0).setChecked(true);
やnavigationView.setCheckedItem(id);
などの他の答えはsetSelectedItemId
を呼び出しても機能しません。
BottomNavigationView bottomNavigationView = findViewById(R.id.bottom_navigation_view);
bottomNavigationView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {
// TODO: 10-Aug-19 your code here
}
});
bottomNavigationView.setSelectedItemId(R.id.myitem);