it-swarm.com.ru

Как сделать так, чтобы заголовок Панели инструментов был кликабельным, как в ActionBar, не устанавливая его как ActionBar?

Фон

Я хочу показать ActionBar на PreferenceActivity, так как он недоступен для устройств, предшествующих Honeycomb (даже в библиотеке поддержки).

Поскольку такого класса нет в библиотеке поддержки, я не могу просто вызвать "setSupportActionBar". Я также не хочу использовать библиотеку (например, this ), так как все библиотеки, которые я нашел, все еще используют стиль 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, но ни один не помог. 

Единственное, что почти сработало, - это использовать «setNavigationIcon» вместо «setLogo», но это фактически делает кликабельность заголовка и значка, но только значок показывает эффект нажатия (даже если я нажимаю на заголовок). 

Вопрос

Как добавить внешний вид панели инструментов, чтобы ее заголовок и логотип выглядели как панель действий?

7
android developer

Просто помните, что панель инструментов - это просто 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. Не имеет значения, используется ли Toolbar как ActionBar или нет, он работает в обоих случаях.

Просто установите прослушиватель щелчков на самом Toolbar, это приведет к полному срабатыванию прослушивателя щелчков Toolbar, если не щелкнет пункт меню или значок home. Для меня это именно то, что я ожидаю ...

Например:

 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, домашний щелчок и т. п. НЕ БУДЕТ запускать событие onClick. Похоже на хорошее решение

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
                }
            });
        }
    }
}
0
user496854