Авторазмер TextView с помощью screenSlider и Fragment - PullRequest
3 голосов
/ 11 марта 2019

Я сделал screenSlider с фрагментами страниц.

Проблема в том, что на одной странице иногда TextView содержит длинный текст, который не будет отображаться полностью, но будет отображаться только первое более короткое слово (я думаю, это потому, что другие слова будут идти в новой строке нижнего поля экрана).

Итак, я реализовал авторазмер TextView, но теперь все TextView кажутся маленькими (12sp), даже когда текст настолько короткий, что может отображаться правильно на 36sp (например, только одно маленькое слово).

MainActivity:

public class MainActivity extends FragmentActivity
{
    // The pager widget, which handles animation 
    // and allows swiping horizontally to access previous
    // and next wizard steps.
    private ViewPager mPager;
    // The pager adapter, which provides the pages to the view pager widget.
    private PagerAdapter mPagerAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        // Instantiate a ViewPager and a PagerAdapter.
        mPager = (ViewPager) findViewById(R.id.pager);
        mPagerAdapter = new ScreenSlidePagerAdapter(getSupportFragmentManager());
        mPager.setAdapter(mPagerAdapter);
    }
}

ScreenSlidePagerAdapter расширяет FragmentStatePagerAdapter:

private class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter
{
    ScreenSlidePagerAdapter(FragmentManager fm)
    {
        super(fm);
    }

    @Override
    public Fragment getItem(int position)
    {
        ScreenSlidePageFragment fragment = new ScreenSlidePageFragment();

        ...

        return fragment;
    }
}

ScreenSlidePageFragment:

public class ScreenSlidePageFragment extends Fragment
{
    private int imageId;
    ImageView imageView;

    private String name = "";

    @Override
    public View onCreateView(LayoutInflater inflater
                            , ViewGroup container
                            , Bundle savedInstanceState)
    {
        ViewGroup rootView = null;

        TextView textView = rootView.findViewById(R.id.text_view_name);
        textView.setText(name);

        TextViewCompat.setAutoSizeTextTypeWithDefaults(textView
                  , TextViewCompat.AUTO_SIZE_TEXT_TYPE_UNIFORM);

        return rootView;
    }

    ... getters and setters (e.g. to set the name)
}

основной макет:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/rootView">

    <android.support.v4.view.ViewPager
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/pager"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</android.support.constraint.ConstraintLayout>

макет пейджера:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/rootViewPager">

    <android.support.v4.view.ViewPager
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/pager"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</android.support.constraint.ConstraintLayout>

макет страницы с одним фрагментом:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    android:id="@+id/rootView">

    <ImageView
        android:id="@+id/image_view"
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:layout_constraintBottom_toTopOf="@+id/text_view_name"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/text_view_name"
        android:layout_width="0dp"
        android:layout_height="50dp"
        android:gravity="center_vertical|center_horizontal"
        android:maxLines="1"
        android:text="Name of image"
        app:autoSizeTextType="uniform"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/image_view" />

</android.support.constraint.ConstraintLayout>

Как сделать так, чтобы текст в text_view_name соответствовал размеру, чтобы он отображался равномерно?

например. текст name должен отображаться в 36sp, а текст name looooooooong в < 36sp.

Edit:

Я не хочу использовать внешние библиотеки.

Спасибо

Ответы [ 2 ]

3 голосов
/ 10 июля 2019

Если Autosizing TextViews не может достичь желаемого поведения, вы можете использовать библиотеку android-autofittextview .

Я пользовался ею до того, как узнал AutosizingTextViews, и он дал мне именно то, что вы хотели.

Как нас

  • В вашем Gradle:

    dependencies {
    compile 'me.grantland:autofittextview:0.2.1'
    }
    
  • И в вашем XML:

    <me.grantland.widget.AutofitTextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:singleLine="true"
    android:maxLines="2"
    android:textSize="36sp"
    autofit:minTextSize="12sp"
    />
    
3 голосов
/ 10 июля 2019

Я думаю, вы можете использовать app:autoSizeMaxTextSize. Пример * +1002 *

<TextView
    android:layout_width="match_parent"
    android:layout_height="50dp"
    app:autoSizeTextType="uniform"
    app:autoSizeMinTextSize="20sp"
    app:autoSizeMaxTextSize="36sp" />

Обратите внимание, если ваш minSDK> = 26, вы можете использовать android:... вместо app:...

...