web-dev-qa-db-ja.com

ツールバーのタイトルをActionBarとして設定せずに、ActionBarとまったく同じようにクリック可能にする方法は?

バックグラウンド

PreferenceActivityにActionBarを表示したいのですが、これはHoneycomb以前のデバイスでは利用できません(サポートライブラリ内でも)。

このようなクラスはサポートライブラリで利用できないため、単に "setSupportActionBar"を呼び出すことはできません。また、ライブラリを使用したくありません( this one など)。 Holoスタイルを使用しているため、これを考慮してこれまで更新されていません。

これを行うには、ActionBarのタイトルの外観を新しい Toolbar クラスに模倣しようとしています。サポートライブラリv7で発表されました。

問題

タイトルと「上へ」ボタンを配置することに成功しましたが、通常のアクションバーのように、タッチの効果も含めてクリック可能にする方法がわかりません。

コード

これがコードです:

SettingsActivity.Java

public class SettingsActivity extends PreferenceActivity
  {
  @Override
  protected void onCreate(final Bundle savedInstanceState)
    {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_settings);
    addPreferencesFromResource(R.xml.pref_general);
    final Toolbar toolbar=(Toolbar)findViewById(R.id.toolbar);
    toolbar.setBackgroundColor(getResources().getColor(R.color.windowBackgroundColor));
    toolbar.setTitle("Settings");
    toolbar.setClickable(true);
    toolbar.setLogo(getResIdFromAttribute(this,R.attr.homeAsUpIndicator));
    }

  public static int getResIdFromAttribute(final Activity activity,final int attr)
    {
    if(attr==0)
      return 0;
    final TypedValue typedvalueattr=new TypedValue();
    activity.getTheme().resolveAttribute(attr,typedvalueattr,true);
    return typedvalueattr.resourceId;
    }
  }

activity_settings.xml

<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:tools="http://schemas.Android.com/tools"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:orientation="vertical"
    tools:context="com.antonioleiva.materialeverywhere.SettingsActivity" >

    <include
        Android:id="@+id/toolbar"
        layout="@layout/toolbar" />

    <FrameLayout
        Android:layout_width="match_parent"
        Android:layout_height="match_parent" >

        <View
            Android:layout_width="match_parent"
            Android:layout_height="wrap_content"
            Android:background="@drawable/abs__ab_solid_shadow_holo" />

        <ListView
            Android:id="@Android:id/list"
            Android:layout_width="match_parent"
            Android:layout_height="match_parent" />
    </FrameLayout>

</LinearLayout>

私が試したこと

Toolbarクラスのすべてのクリックリスナータイプを試しましたが、どれも役に立ちませんでした。

「setLogo」の代わりに「setNavigationIcon」を使用することだけがほとんど機能しましたが、実際にはタイトルとアイコンがクリック可能になっていますが、アイコンをクリックしただけの場合の影響が示されています(タイトルをクリックしても)。

質問

ツールバーのルックアンドフィールを追加して、タイトルとロゴをアクションバーのようにするにはどうすればよいですか。

12

Toolbarは基本的に単なるViewGroupであることを覚えておいてください。TextViewをそれに追加して、そのようなonClickイベントをリッスンすることができます。

TextViewをXMLでツールバーに追加します。

<Android.support.v7.widget.Toolbar
    Android:id="@+id/toolbar_top"
    Android:layout_height="wrap_content"
    Android:layout_width="match_parent"
    Android:minHeight="?attr/actionBarSize"
    Android:background="@color/action_bar_bkgnd"
    app:theme="@style/ToolBarTheme" >


    <TextView
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:text="Settings"
        Android:id="@+id/toolbar_title" />

    </Android.support.v7.widget.Toolbar>

あなたの活動のクリックを聞いてください:

toolbarTop.findViewById(R.id.toolbar_title).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Log.d(TAG,"Clicked");
        }
    });
19
MrEngineer13

私は同じ問題を抱えており、(クリック可能なタイトルに対して)Toolbarを使用してこれを行う非常に便利な方法を見つけました。 ToolbarActionBarとして使用されているかどうかに関係なく、どちらの場合でも機能します。

Toolbar自体にクリックリスナーを設定するだけで、メニュー項目またはホームアイコンがクリックされない場合、クリックリスナーが完全にToolbarfiringされます。私にとって、それはまさに私が期待することです...

例えば:

 setSupportActionBar(toolbar);
 getSupportActionBar().setDisplayHomeAsUpEnabled(true);
 toolbar.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Toast.makeText(getThis(), "Toolbar title clicked", Toast.LENGTH_SHORT).show();
        }
    });

onOptionsItemSelected、ホームクリックなどWO N'TonClickイベントを発生させます。良い解決策のようです

23
prom85

実際には、回避策を実行する必要なく、かなり簡単に実行できます。 Toolbarのすべての子ビューを循環させて、正しいタイトルテキストを持つTextViewを見つけるだけです。

String title = toolbar.getTitle();
for(int i = 0; i < toolbar.getChildCount(); i++){
    View tmpView = toolbar.getChildAt(i);
    if("Android.support.v7.widget.AppCompatTextView".equals(tmpView.getClass().getName())){
        if(((AppCompatTextView) tmpView).getText().equals(title)){
            tmpView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    //do whatever you want here
                }
            });
        }
    }
}
1
user496854