Android mancj.MaterialSearchBar: использование отражения для переопределения и изменения некоторых макетов API и виджетов, семейства шрифтов, жирности и отступов. - PullRequest
0 голосов
/ 06 октября 2018

Я использую https://github.com/mancj/MaterialSearchBar, чтобы установить строку поиска с бургером меню. Я не могу изменить API.

Вот что я получил:

enter image description here

Вопросы

Как ...:

  1. Уменьшить отступ слева от текста?

  2. Изменить семейство шрифтов дляпоследний?

  3. Наконец, отключите смелость?

Примечание: некоторые вопросы будут завершены другими в следующем разделе, Согласно документации .

Согласно документации

mt_aBCD - это атрибуты XML, которые позволяют настраивать панель поиска.Однако вышеперечисленных не существует.Их эквивалент в Java (setABCD нет).

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

  1. Должен ли я что-то изменить в этом API (это разрешено и законно)?(как?)
  2. Могу ли я переопределить стиль?и т. д. (как?)
  3. Другое?

Моя реализация

Я отредактировал свой файл сборки, затем просто добавил панель поиска в свой макет XML:

    <com.mancj.materialsearchbar.MaterialSearchBar
    android:id="@+id/material_search_bar"
    style="@style/MaterialSearchBarLight"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:layout_marginEnd="15dp"
    android:layout_marginStart="15dp"
    android:layout_marginTop="15dp"
    app:layout_constraintBottom_toBottomOf="@+id/toolbar"
    app:layout_constraintEnd_toEndOf="@+id/toolbar"
    app:layout_constraintStart_toStartOf="@+id/toolbar"
    app:layout_constraintTop_toTopOf="@+id/toolbar"
    app:mt_maxSuggestionsCount="10"
    app:mt_navIconEnabled="true"
    app:mt_placeholder="@string/search_placeholder" />

Ответы [ 2 ]

0 голосов
/ 11 июня 2019

Я решил то же самое с этим:

Typeface typeface = ResourcesCompat.getFont(Objects.requireNonNull(getContext()), R.font.XXX);
placeHolder = findViewById(R.id.mt_placeholder);
placeHolder.setTypeface(typeface);
0 голосов
/ 10 октября 2018

Первый момент:

эта библиотека не поддерживает font-familly.Этот вопрос существует в блоке github" ISSUE "

enter image description here


Второй момент:

отступ для текста, который не поддерживает как и "отключить жирность"


Но вы можете решить свои проблемы с помощью отражения

это не лучшее решение, но оно работает

    searchBar = (MaterialSearchBar) findViewById(R.id.searchBar);
    try {
        final Field placeHolder = searchBar.getClass().getDeclaredField("placeHolder");
        placeHolder.setAccessible(true);
        final TextView textView = (TextView) placeHolder.get(searchBar);
        textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 16);

        // fix trouble number 1 paddingLeft
        textView.setPadding(0, 0, 0, 0);
        final RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) textView.getLayoutParams();
        layoutParams.setMargins(0,0,0,0);

        //fix trouble number 2 font-family and number 3 Finally, disable boldness?
        Typeface typeface = Typeface.createFromAsset(getAssets(), getString(R.string.roboto_medium));
        //<string name="roboto_medium">fonts/Roboto-Medium.ttf</string>
        textView.setTypeface(typeface);

        textView.setText("Hello World!");
    } catch (NoSuchFieldException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    }

enter image description here

Меню бургера имеет размер 48dp, это не поля (DeclaredField = navIcon) enter image description here


Последний вариант

скопируйте эту библиотеку в свой проект и отредактируйте все, что вы хотите.
вы можете сделать это, потому что эта библиотека использовала лицензию MIT самое важное указатьоригинальный автор

...