シンプルなAndroid.support.v7.widget.Toolbar
そして私がやろうとしていることは、左上隅にある「ハンバーガー」アイコンを押してNavigationDrawerを開くことだけです。 「ハンバーガー」ボタンが表示され、左から引っ張り始めると、ボタンにアニメーションが表示されますが、ボタンを押しても、NavigationDrawerが期待どおりに開閉しません。 [Googleのドキュメント] [1]をフォローしましたが、これを理解することはできません。混乱して申し訳ありませんが、現在使用しようとしているsimplifiedコードは次のとおりです。
public class MainActivity extends AppCompatActivity implements
View.OnClickListener,
GoogleApiClient.ConnectionCallbacks,
GoogleApiClient.OnConnectionFailedListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.my_toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d("NICK", "button button button..................");
}
});
mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer);
NavigationView n = (NavigationView) findViewById(R.id.nav);
mDrawerLayout.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
Log.d("NICK", "button button button..................");
}
});
//mDrawerLayout.setDrawerListener(mDrawerToggle);
n.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(MenuItem menuItem) {
switch (menuItem.getItemId()) {
////.......
}
mDrawerLayout.closeDrawers(); // CLOSE DRAWER
return true;
}
});
@Override
public boolean onOptionsItemSelected(MenuItem item) {
Log.d("NICK","CWECNEWKVNERIPNVIEWNFVIPEWNVIPEWNVPIEWNVPIEWNVPIEWNVPIRWNVPRWVPO");
switch (item.getItemId()) {
case Android.R.id.home:
mDrawerLayout.openDrawer(GravityCompat.START); // OPEN DRAWER
Log.d("NICK","CWECNEWKVNERIPNVIEWNFVIPEWNVIPEWNVPIEWNVPIEWNVPIEWNVPIRWNVPRWVPO");
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
mDrawerToggle.onConfigurationChanged(newConfig);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.drawer, menu);
return true;
}
}
}
そして、実行中にログデバッグステートメントを取得しません。
これは本質的に私が持っている問題です: https://stackoverflow.com/a/26636045/148999 。私はこれに従いましたが、うまくいきません。
ハンバーガーアイコンが押されたときにsetNavigationOnClickListener
が呼び出されることは私の理解であり、ボタンを押すとログステートメントが取得されないため、イベントを適切に処理することに焦点を当てています。この考えが間違っているかどうか教えてください。 https://developer.Android.com/reference/Android/widget/Toolbar.html#setNavigationOnClickListener(Android.view.View.OnClickListener)
私のレイアウト:
ActivityMain.xml
<RelativeLayout
xmlns:app="http://schemas.Android.com/apk/res-auto"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent" xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:id="@+id/d"
Android:background="@drawable/home_wall">
<Android.support.v7.widget.Toolbar
Android:id="@+id/my_toolbar"
Android:layout_height="wrap_content"
Android:layout_width="match_parent"
Android:minHeight="?attr/actionBarSize"
Android:background="?attr/colorPrimary"
Android:layout_marginBottom="10dp"
app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
Android:layout_marginTop="25dp"
xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto" />
<Android.support.v4.widget.DrawerLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto"
Android:layout_width="match_parent"
Android:id="@+id/drawer"
Android:layout_height="match_parent"
Android:fitsSystemWindows="true">
<ImageView
Android:layout_width="fill_parent"
Android:layout_height="200dp"
Android:id="@+id/imageView"
Android:src="@drawable/trans2"
Android:layout_alignParentTop="true"
Android:layout_marginTop="10dp"
Android:layout_marginLeft="5dp"
Android:layout_marginRight="5dp"
Android:paddingBottom="300dp" />
<RelativeLayout
Android:orientation="vertical"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent"
Android:id="@+id/d8"
Android:layout_alignParentTop="true"
Android:layout_alignLeft="@+id/imageView"
Android:layout_alignStart="@+id/imageView"
Android:paddingTop="0dp">
<Button
Android:layout_width="75dp"
Android:layout_height="50dp"
Android:text="Gallery"
Android:id="@+id/save_button"
Android:background="#dd2c00" Android:textColor="#fff"
Android:layout_below="@+id/Purchases"
Android:layout_toRightOf="@+id/start_button"
Android:layout_toEndOf="@+id/start_button" />
<Button
Android:layout_width="125dp"
Android:layout_height="50dp"
Android:text="Store"
Android:id="@+id/Purchases"
Android:background="#ff6e40" Android:textColor="#fff"
Android:layout_above="@+id/instructions_button6"
Android:layout_toLeftOf="@+id/start_button"
Android:layout_toStartOf="@+id/start_button"
Android:layout_marginBottom="98dp" />
<Button
Android:layout_width="75dp"
Android:layout_height="50dp"
Android:text="Help"
Android:id="@+id/instructions_button6"
Android:background="#dd2c00" Android:textColor="#fff"
Android:layout_alignParentBottom="true"
Android:layout_toLeftOf="@+id/start_button"
Android:layout_toStartOf="@+id/start_button"
Android:layout_marginLeft="5dp"
Android:layout_marginBottom="10dp" />
<Button
Android:layout_width="75dp"
Android:layout_height="300dp"
Android:text="Start"
Android:id="@+id/start_button"
Android:background="#ff3d00"
Android:textColor="#fff"
Android:layout_alignParentBottom="true"
Android:layout_centerHorizontal="true"
Android:layout_marginBottom="10dp" />
<Button
Android:layout_width="125dp"
Android:layout_height="50dp"
Android:text="Achievements"
Android:id="@+id/Scores"
Android:background="#ff6e40" Android:textColor="#fff"
Android:layout_alignTop="@+id/Purchases"
Android:layout_toRightOf="@+id/start_button"
Android:layout_toEndOf="@+id/start_button" />
<TextView
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:text="Welcome to the quiz!"
Android:id="@+id/textView"
Android:textColor="#fff"
Android:textSize="20dp"
Android:layout_alignParentTop="true"
Android:layout_centerHorizontal="true"
Android:layout_marginTop="70dp" />
<!-- sign-in button -->
<com.google.Android.gms.common.SignInButton
Android:id="@+id/sign_in_button"
Android:layout_width="110dp"
Android:layout_height="50dp"
Android:layout_above="@+id/start_button"
Android:layout_centerHorizontal="true"
Android:visibility="visible" />
<!-- sign-out button -->
<Button
Android:id="@+id/sign_out_button"
Android:layout_width="125dp"
Android:layout_height="wrap_content"
Android:text="Sign Out"
Android:visibility="invisible"
Android:background="#dd4b39"
Android:textColor="#fff"
Android:layout_alignTop="@+id/sign_in_button"
Android:layout_centerHorizontal="true"
Android:layout_marginTop="160dp" />
</RelativeLayout>
<Android.support.design.widget.NavigationView
Android:layout_width="wrap_content"
Android:layout_height="match_parent"
Android:layout_gravity="start"
Android:background="#fff"
Android:id="@+id/nav"
app:headerLayout="@layout/drawer_header"
app:menu="@menu/drawer"/>
</Android.support.v4.widget.DrawerLayout>
Drawer.xml
:
<menu xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:id="@+id/drawer_menu"
xmlns:app="http://schemas.Android.com/apk/res-auto">
<item Android:title="Google Play Games"
Android:icon="@drawable/ic_local_airport_white_48dp">
<menu>
<item
Android:id="@+id/Sign_in_drawer"
Android:icon="@drawable/games_controller_grey"
Android:title="Sign in" />
<item
Android:id="@+id/ach"
Android:icon="@drawable/games_achievements"
Android:title="Achievements" />
</menu>
</item>
<item Android:title="Start a Quiz"
Android:icon="@drawable/ic_local_airport_white_48dp">
<menu>
<item
Android:id="@+id/quizStart25"
Android:icon="@drawable/ic_local_airport_white_48dp"
Android:title="25 Questions" />
<item
Android:id="@+id/quizStart10"
Android:icon="@drawable/ic_local_airport_white_48dp"
Android:title="10 Questions" />
</menu>
</item>
<group
Android:checkableBehavior="single">
<item
Android:id="@+id/gallery"
Android:icon="@drawable/ic_photo_library_white_48dp"
Android:title="Gallery" />
<item
Android:id="@+id/stats"
Android:icon="@drawable/ic_toc_white_48dp"
Android:title="Statistics" />
<item
Android:id="@+id/store"
Android:icon="@drawable/ic_shop_white_48dp"
Android:title="Store" />
<item
Android:id="@+id/settings"
Android:icon="@drawable/ic_settings_white_48dp"
Android:title="Settings" />
<item
Android:id="@+id/about"
Android:icon="@drawable/ic_info_white_48dp"
Android:title="About" />
</group>
<item Android:title="Support">
<menu>
<item
Android:id="@+id/help_drawer"
Android:icon="@drawable/ic_help_white_48dp"
Android:title="Help" />
<item
Android:id="@+id/report"
Android:icon="@drawable/ic_report_problem_white_48dp"
Android:title="Contact Developer" />
<item
Android:id="@+id/GPlusCommunity"
Android:icon="@drawable/btn_g_white_normal"
Android:title="Google+ Community" />
</menu>
</item>
ActivityMain.xmlでは、ツールバーはDrawerLayoutの外側にあります。それが問題です。ツールバーをDrawLayoutと対話させたい場合、ToolbarはDrawerLayoutの子である必要があります。
問題を解決するには、DrawerLayoutをアクティビティのルートにします。 ドキュメント です。関連する引用は次のとおりです。
ナビゲーションドロワーを追加するには、レイアウトのルートビューとしてDrawerLayoutオブジェクトを使用してユーザーインターフェイスを宣言します。 DrawerLayout内に、画面のメインコンテンツ(引き出しが非表示の場合のプライマリレイアウト)を含む1つのビューと、ナビゲーション引き出しのコンテンツを含む別のビューを追加します。
したがって、基本的に、ActivityMain.xmlを次のように構成します。
<Android.support.v4.widget.DrawerLayout ...>
<RelativeLayout ...>
<Android.support.v7.widget.Toolbar .../>
<!-- Your other content goes here -->
</RelativeLayout>
<Android.support.design.widget.NavigationView .../>
</Android.support.v4.widget.DrawerLayout>
これで問題が解決するはずです。
引き出しトグルを同期する必要があります。
@Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
// Sync the toggle state after onRestoreInstanceState has occurred.
mDrawerToggle.syncState();
}
編集:そのコードは私のために働いています(あなたの投稿からコピーされました)
public class TempActivity extends AppCompatActivity {
private ActionBarDrawerToggle mDrawerToggle;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.temp);
setupDrawer();
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
mDrawerToggle.onConfigurationChanged(newConfig);
}
@Override
public boolean onOptionsItemSelected(final MenuItem item) {
if (mDrawerToggle.onOptionsItemSelected(item)) {
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
mDrawerToggle.syncState();
}
private void setupDrawer() {
Toolbar toolbar = (Toolbar) findViewById(R.id.my_toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setHomeButtonEnabled(true);
DrawerLayout mDrawerLayout = (DrawerLayout) findViewById(R.id.my_drawer_layout);
mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,toolbar,R.string.drawer_open, R.string.drawer_close) {
public void onDrawerClosed(View view) {
super.onDrawerClosed(view);
invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
}
public void onDrawerOpened(View drawerView) {
super.onDrawerOpened(drawerView);
invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
}
};
mDrawerLayout.setDrawerListener(mDrawerToggle);
}
}
<Android.support.v4.widget.DrawerLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto"
Android:id="@+id/my_drawer_layout"
Android:layout_width="match_parent"
Android:layout_height="match_parent">
<LinearLayout
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:orientation="vertical">
<Android.support.v7.widget.Toolbar
Android:id="@+id/my_toolbar"
Android:layout_width="match_parent"
Android:layout_height="?attr/actionBarSize"
Android:background="?attr/colorPrimary"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />
<FrameLayout
Android:id="@+id/content_frame"
Android:layout_width="match_parent"
Android:layout_height="match_parent" />
</LinearLayout>
<RelativeLayout
Android:id="@+id/left_drawer"
Android:layout_width="240dp"
Android:layout_height="match_parent"
Android:layout_gravity="start"
Android:choiceMode="singleChoice"
Android:divider="@Android:color/transparent"
Android:dividerHeight="0dp"
Android:background="#111">
<TextView
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:textColor="#FFF"
Android:text="DRAMER MENU" />
</RelativeLayout>
</Android.support.v4.widget.DrawerLayout>
しかし、新しいNavigationView
を使用している場合、トグルなどは必要ありません。 良い例です 使用方法。
onOptionsItemSelected
メソッドをオーバーライドし、以下で使用します
if(item.getItemId() == Android.R.id.home){ // use Android.R.id
mDrawerLayout.openDrawer(Gravity.LEFT);
}
それが誰かを助けるなら、私にはsetSupportActionBar(toolbar)
を2回呼び出すという愚かなエラーのために同じことが起こりました。 onCreateメソッドで一度だけ呼び出して、二度と呼び出さないでください。私の間違いは、後で別の方法でそれを呼び出しました。
以下のようなアクティビティオプションメニュー管理機能で、ActionBarDrawerToggleクラスのonOptionsItemSelected(MenuItem menuItem)関数を呼び出すだけです。
mDrawerToggle= new ActionBarDrawerToggle(activity, drawerLayout, R.string.nav_drawer_accessbility_drawer_open,
R.string.nav_drawer_accessbility_drawer_close);
@Override
public boolean onOptionsItemSelected(final Android.view.MenuItem item) {
navigation().getOptionsMenuInflater(this).closeSearchView();
// The action bar home/up action should open or close the drawer.
// ActionBarDrawerToggle will take care of this behavior.
mDrawerToggle.onOptionsItemSelected(item);
return super.onOptionsItemSelected(item);
}
OR
以下のようなアクティビティのonOptionsItemSelectedをオーバーライドします
public boolean onOptionsItemSelected(MenuItem item) {
if (item != null && item.getItemId() == Android.R.id.home) {
toggle();
}
return super.onOptionsItemSelected(item);
}
private void toggle() {
if (mDrawerLayout.isDrawerVisible(GravityCompat.START)) {
mDrawerLayout.closeDrawer(GravityCompat.START);
} else {
mDrawerLayout.openDrawer(GravityCompat.START);
}
}
引き出しを切り替えるには、「ホームを上に表示」をfalseに設定する必要があります:getSupportActionBar().setDisplayHomeAsUpEnabled(false);
あなたの問題に対する具体的な答えはありませんので、まったく異なるアプローチを提案したいと思います。
私のプロジェクトでは、Mike Penzが開発した Material Drawer を使用しています。見た目は本当にすてきで、簡単に実装でき、心配する必要はあまりありません。
したがって、問題の解決策が見つからない場合は、試してみてください。
ActionBarDrawerToggle
を使用し、public boolean onOptionsItemSelected(MenuItem item)
を実装します
ツールバーはDrawerLayout内にある必要はありません。この問題の原因ではない可能性があります。 toggle.onOptionsItemSelected(item)
は、選択されたアイテムのIDを探し、それがAndroid.R.id.home
その後、引き出しの表示が切り替わります。したがって、ツールバー、またはホームMenuItemを作成するビューは、レイアウトのどこにでも配置できます。
アクティビティ内:
ActionBarDrawerToggle toggle;
private void setupDrawerToggleInActionBar() {
// assuming a Toolbar has been initialized in your onCreate
this.setSupportActionBar(toolbar);
// setup the action bar properties that give us a hamburger menu
ActionBar actionBar = this.getSupportActionBar();
if(actionBar != null) {
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setHomeButtonEnabled(true);
}
// the toggle allows for the simplest of open/close handling
toggle = new ActionBarDrawerToggle(this,
drawerLayout,
R.string.navigation_drawer_open,
R.string.navigation_drawer_close);
// drawerListener must be set before syncState is called
drawerLayout.setDrawerListener(toggle);
toggle.setDrawerIndicatorEnabled(true);
toggle.syncState();
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// This is required to make the drawer toggle work
if(toggle.onOptionsItemSelected(item)) {
return true;
}
/*
* if you have other menu items in your activity/toolbar
* handle them here and return true
*/
return super.onOptionsItemSelected(item);
}
ただし、「予防は治療よりも優れている」と言われているので、ここで受け入れられている答えは大丈夫です。mDrawerToggle.syncState();の追加onPostCreateおよびonConfigurationChanged()で、上記の@mbmcで回答されたように、はるかにうまく動作します。
@Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
// Sync the toggle state after onRestoreInstanceState has occurred.
mDrawerToggle.syncState();
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
mDrawerToggle.onConfigurationChanged(newConfig);
}