ToolBar使用

12302 ワード

ToolBar
きほんしよう
ToolbarはAndroid 5.0から発売されるMaterialDesignスタイルのナビゲーションコントロールで、GoogleはAndroidクライアントのナビゲーションバーとしてToolbarを使用することをお勧めします.これにより、以前のActionbarに取って代わることができます.Actionbarに比べてToolbarは明らかに柔軟である.ActionbarのようにActivityの上部に固定するのではなく、インタフェースの任意の位置に置くことができます.
ToobarはAndroid 5.0に導入されたばかりで、Googleも互換パッケージappcompat-v7で下位互換のToolBar:android.support.v7.widget.Toolbarを提供しています.
まずbuildでgradleに依存を追加します.
compile 'com.android.support:appcompat-v7:24.2.0'

次に、トピックが提供するactionbarを無効にします.



レイアウトファイルにToolBarを追加できます.ToolBarは他のコントロールに比べて特別な点はありません.ToolBarを追加するのと他のコントロールを追加するのと同じです.



    


最後にActivityまたはFragmentでsetSupportActionBarを呼び出すことでToolBarにActionBarの役割を果たさせる.
public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
    }
}

Toolbarをactivityのactionbarとして設定すると、ActionBarクラスが提供するメソッドを呼び出してActionBarを設定できます.ActionBarでよく使用される方法:
  • hide():ActionBarを隠す
  • show():ActionBarを表示
  • isShowing():ActionBarが表示されているか否かを判断
  • setBackgroundDrawable(Drawable drawable):ActionBarの背景を設定します.
  • setDisplayHomeAsUpEnabled(boolean b):戻るボタンを表示するかどうか.
  • setDisplayShowHomeEnabled(boolean b);iconを表示するかどうか
  • setDisplayShowTitleEnabled(boolean b);タイトル表示の有無
  • setDisplayShowCustomEnabled(boolean b);カスタムviewを表示するかどうか
  • setIcon();設定Icon
  • setTitle();タイトル設定
  • getSelectedNavigationIndex()選択項目のインデックスを取得する.

  • ActionButtonsの追加
    Activityをオンにすると、ActivityのonCreateOptionsMenu()メソッドを呼び出してaction buttonsを配置します.この方法を使用して、すべてのaction buttonsを定義するメニューリソースをinflateします.
    
        
        
    
    

    次にActivityのonCreateOptionsMenu()メソッドを呼び出し、すべてのaction buttonをActionBarに追加します.
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu items for use in the action bar
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.main_activity_actions, menu);
        return super.onCreateOptionsMenu(menu);
    }
    

    itemをactionbarに直接表示するには、ラベルにshowAsAction=「ifRoom」プロパティを追加する必要があります.
    
        
        ...
    
    

    十分なスペースがない場合は、懸濁メニューのスタイルで表示されます.
    上のshowAsActionプロパティでは、カスタムネーミングスペースが使用されていることに注意してください.supportlibraryで定義したプロパティでは、ネーミングスペースをカスタマイズする必要があります.これらの属性は古いAndroidデバイスには存在しないからです.
    titleとiconのプロパティを同時に指定する場合、action itemはデフォルトでiconのみを表示します.タイトルを表示する必要がある場合は、showAsActionプロパティにwithText値を追加する必要があります.iconが使用可能でactionbarスペースが不足している場合は、titleは表示されません.
    
    

    titleを表示する必要はないかもしれませんが、titleプロパティの値を指定します.
  • スペースが足りない場合、メニューは浮遊状態で表示され、titleのみが表示されます.
  • action itemがiconのみを表示している場合は、ユーザーはエントリを長押ししてtitleを表示することができる.

  • showAsActionプロパティの値をalwaysに設定して、actionitemをずっと表示させることもできますが、action itemをずっと表示させないほうがいいです.これにより、狭い画面でレイアウトが適切になるという問題が発生します.
    エントリを処理するにはクリック
    ユーザーがエントリをクリックすると、クリックしたMenuItemがActivityのonOptionsItemSelected()メソッドに渡されます.
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle presses on the action bar items
        switch (item.getItemId()) {
            case R.id.action_search:
                Toast.makeText(this, "     ", Toast.LENGTH_SHORT).show();
                return true;
            case R.id.action_add_alarm:
                Toast.makeText(this, "       ", Toast.LENGTH_SHORT).show();
                return true;
            //        id android.R.id.home                        。
            case android.R.id.home:
                finish();
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }
    

    ActionViewの追加
    ActionViewは、ActivityまたはFragmentを変更する必要がなく、ActionBarを置き換える必要がない複雑な操作のための高速エントリを提供する.たとえば、検索を行う場合は、actionbarにSearchViewコンポーネントを追加することで実現できます.
    ActionViewを追加するには、acionlayoutプロパティにレイアウトリソースを指定するか、actionViewプロパティにコンポーネントクラスを指定します.
    
        
        
    
    

    注意showAsActionプロパティにはcollapseActionView値が含まれています.
    onCreateOptionsMenu()メソッドでaction viewを構成できます.静的方法でgetActionView()はaction viewオブジェクトを取得できます.この方法ではMenuItemオブジェクトを渡す必要があります.
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu items for use in the action bar
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.main_menu, menu);
        MenuItem searchItem = menu.findItem(R.id.action_search);
        SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem);
        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String query) {//    
                Toast.makeText(MainActivity.this, "  "+query, Toast.LENGTH_SHORT).show();
                return false;
            }
            @Override
            public boolean onQueryTextChange(String newText) {
                return false;
            }
        });
        return super.onCreateOptionsMenu(menu);
    }
    

    折りたたみ可能なActionViewの処理
    action barのスペースを節約するために、action viewをaction buttonに折り畳むことができます.このaction buttonが選択されると、action viewが展開されます.showAsActionプロパティにcollapseActionView値を追加すれば、action viewを折り畳むことができます.
    ユーザがaction buttonをクリックすると、action viewは自動的に展開され、onOptionsItemSelected()メソッドでクリック処理を行う必要はありません.ただし、戻り値をtrueに設定すると、action viewは展開されません.
    携帯電話の戻りボタンやaction barの戻りボタンを押すと、action viewが折り畳まれます.
    OnActionExpandListenerリスナーでは、action viewの折りたたみと展開をリスニングできます.
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu items for use in the action bar
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.main_menu, menu);
        MenuItem searchItem = menu.findItem(R.id.action_search);
        MenuItemCompat.setOnActionExpandListener(searchItem, new MenuItemCompat.OnActionExpandListener() {
            @Override
            public boolean onMenuItemActionCollapse(MenuItem item) {
                Toast.makeText(MainActivity.this, "  ", Toast.LENGTH_SHORT).show();
                return true;
            }
    
            @Override
            public boolean onMenuItemActionExpand(MenuItem item) {
                Toast.makeText(MainActivity.this, "  ", Toast.LENGTH_SHORT).show();
                return true;
            }
        });
        return super.onCreateOptionsMenu(menu);
    }
    

    ActionProviderの追加
    Actionviewと同様に、action providerはレイアウトをカスタマイズすることによって操作ボタンを置き換える.しかしaction providerはすべての動作動作を制御し、クリックされたときにサブメニューを表示することができる.
    ActionViewクラスのプロパティにActionProviderクラスを設定ことで、action providerを追加します.ActionProviderを継承することでカスタムaction providerを作成することもできる.AndroidはShareActionProviderなどのaction providerを提供しています.
    各ActionProviderクラスは独自の動作動作を定義するため、onOptionsItemSelected()メソッドでクリックイベントを設定する必要はありませんが、このメソッドで他の操作を設定したり、onPerformDefaultAction()で別の操作を設定したりすることができます.
    ActionProviderがサブメニューを提供する場合、ユーザーがリストを開くか、サブメニューを選択すると、activityはonOptionsItemSelected()を呼び出しません.
    ShareActionProviderを使用して共有操作を追加するには、次の手順に従います.ActionProviderClass属性値をShareActionProviderクラスに設定.
    
        
        
    
    

    2.共有したいIntentを定義します.onCreateOptionsMenu()メソッドでMenuItemCompatを呼び出す.getActionProvider()ShareActionProviderオブジェクトを取得し、ShareActionProviderのsetShareIntent()を呼び出して共有の意図を設定します.
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu items for use in the action bar
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.main_menu, menu);
        MenuItem shareItem = menu.findItem(R.id.action_share);
        ShareActionProvider shareActionProvider = (ShareActionProvider)
                MenuItemCompat.getActionProvider(shareItem);
        shareActionProvider.setShareIntent(getDefaultIntent());
        return super.onCreateOptionsMenu(menu);
    }
    
    private Intent getDefaultIntent() {
        Intent intent = new Intent(Intent.ACTION_SEND);
        intent.setType("image/*");
        return intent;
    }
    

    カスタムActionProviderの作成
    カスタムActionProviderを作成するには、ActionProviderクラスを簡単に継承し、次の方法を実装する必要があります.
    OnCreateActionView()このメソッドはaction viewを取得するために使用されます.コンストラクタから受信したContextオブジェクトを使用して、LayoutInflaterオブジェクトのインスタンスを取得し、操作ウィンドウをXMLリソースで埋め込み、イベントリスナーを登録します.
    public View onCreateActionView(MenuItem forItem) {
        // Inflate the action view to be shown on the action bar.
        LayoutInflater layoutInflater = LayoutInflater.from(mContext);
        View view = layoutInflater.inflate(R.layout.action_provider, null);
        ImageButton button = (ImageButton) view.findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // Do something...
            }
        });
        return view;
    }
    

    onPerformDefaultAction()このメソッドは、懸濁メニューのメニューを選択すると呼び出され、オペレータは選択したメニュー項目に対してデフォルトの操作を実行する必要があります.ただし、オペレータプロバイダがサブメニューを提供している場合は、懸濁メニューのメニュー項目のサブメニューであっても、onPrepareSubMenu()コールバックメソッドでサブメニューを表示します.これによりonPerformDefaultAction()はサブメニュー表示時に呼び出されません.注意:onOptionsItemSelected()コールバックメソッドを実装したActivityまたはFramentオブジェクトは、item-selectedイベント(true)を処理することによって、オペレーションプロバイダのデフォルト動作を上書きすることができます.この場合、onPerformDefaultAction()メソッドは呼び出されません.
    リファレンス
  • Adding the App Bar
  • Using the App ToolBar
  • Android開発:最も詳しいToolbar開発実践総括
  • カスタムActionProvider ToolBarカスタムMenuレッドポイント
  • Android-ActionItemBadge