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」を使用することだけがほとんど機能しましたが、実際にはタイトルとアイコンがクリック可能になっていますが、アイコンをクリックしただけの場合の影響が示されています(タイトルをクリックしても)。
ツールバーのルックアンドフィールを追加して、タイトルとロゴをアクションバーのようにするにはどうすればよいですか。
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");
}
});
私は同じ問題を抱えており、(クリック可能なタイトルに対して)Toolbar
を使用してこれを行う非常に便利な方法を見つけました。 Toolbar
がActionBar
として使用されているかどうかに関係なく、どちらの場合でも機能します。
Toolbar
自体にクリックリスナーを設定するだけで、メニュー項目またはホームアイコンがクリックされない場合、クリックリスナーが完全にToolbar
firingされます。私にとって、それはまさに私が期待することです...
例えば:
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
イベントを発生させます。良い解決策のようです
実際には、回避策を実行する必要なく、かなり簡単に実行できます。 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
}
});
}
}
}