如何为较旧的Android API实现TextView行间距方法?

时间:2015-09-13 04:25:43

标签: android textview android-api-levels

之前,我问过一个题为:" How to paginate text in Android"在stackoverflow上,这导致了一个很好的答案,帮助了我这么多。现在我需要在旧的Android API上移植代码,以及Android API版本8,所以我可以在Android 2.2上开始运行我的应用程序,从Android 2.2开始。

我遇到的问题是答案中使用的某些方法仅适用于Android API 16 +。

        mPagination = new Pagination(mText,
                mTextView.getWidth(),
                mTextView.getHeight(),
                mTextView.getPaint(),
                mTextView.getLineSpacingMultiplier(),
                mTextView.getLineSpacingExtra(),
                mTextView.getIncludeFontPadding());

所以,我必须至少实现这些方法:

                TextView.getLineSpacingMultiplier()
                TextView.getLineSpacingExtra()
                TextView.getIncludeFontPadding()

第二个似乎已经被描述为here

mTextView.getPaint().getFontSpacing()
* mTextView.getLineSpacingMultiplier() + mTextView.getLineSpacingExtra()

但我不知道其他两个是否与2.2相关,如果是,则如何在Android API版本8中实现它们。有一些提示here,使用源代码我无法完全理解的Android TextView

1 个答案:

答案 0 :(得分:2)

如果我们查看TextView's来源,我们可以看到以下内容。

Android 5.0中:

private float mSpacingMult = 1.0f;
private float mSpacingAdd = 0.0f;
...
private boolean mIncludePad = true;

Android 2.0中:

private float mSpacingMult = 1;
private float mSpacingAdd = 0;
...
private boolean mIncludePad = true;

所以默认值相等。

话虽如此,您可以使用Pagination's构造函数以及适用于API 8+的默认值:

new Pagination(mText,
            mTextView.getWidth(),
            mTextView.getHeight(),
            mTextView.getPaint(),
            1.0f, 0.0f, true);

如果您让用户更改/设置(通过设置菜单)这些参数,则无需再使用getters。您只需使用TextView's setters中的一个设置参数的新值,并将相同的值传递给Pagination's构造函数。例如,

new Pagination(mText,
            mTextView.getWidth(),
            mTextView.getHeight(),
            mTextView.getPaint(),
            newValueOfSpacingMultiplier,
            newValueOfSpacingExtra,
            newValueOfIncludeFontPadding);

修改

我想说的是,在Android API版本8" 中实现它们并不需要"设置后,参数永远不会在TextView's生命周期内发生变化。您可以通过简单的测试来检查它。在设置任何文本之前(例如,在sample codeonCreate()之内)和onGlobalLayout()之后mPagination初始化之后或{{1}中,请查看其值方法)。

update()的所有参数传递给TextView构造函数的想法是在Pagination's和{Layout的引擎下使用TextView类的相同配置实例{1}}。因此,不是将参数传递给之前从Pagination Pagination's检索到的TextView构造函数,而是通过传递您想要的任何值来实现相同配置的gettersLayout并使用Pagination中已满足的TextView setters设置相同的值{/ 1}。