mirror of
https://github.com/BetterAndroid/PanguText.git
synced 2025-09-08 11:34:20 +08:00
205 lines
79 KiB
HTML
205 lines
79 KiB
HTML
<!DOCTYPE html>
|
||
<html lang="en-US">
|
||
<head>
|
||
<meta charset="utf-8">
|
||
<meta name="viewport" content="width=device-width,initial-scale=1">
|
||
<meta name="generator" content="VuePress 2.0.0-rc.0">
|
||
<style>
|
||
:root {
|
||
--c-bg: #fff;
|
||
}
|
||
html.dark {
|
||
--c-bg: #22272e;
|
||
}
|
||
html, body {
|
||
background-color: var(--c-bg);
|
||
}
|
||
</style>
|
||
<script>
|
||
const userMode = localStorage.getItem('vuepress-color-scheme');
|
||
const systemDarkMode = window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches;
|
||
if (userMode === 'dark' || (userMode !== 'light' && systemDarkMode)) {
|
||
document.documentElement.classList.toggle('dark', true);
|
||
}
|
||
</script>
|
||
<link rel="icon" href="/PanguText/images/logo.png"><title>Android | Pangu Text</title><meta name="description" content="A typographic solution for the optimal alignment of CJK characters, English words, and half-width digits">
|
||
<link rel="preload" href="/PanguText/assets/style-Rgr8LWAc.css" as="style"><link rel="stylesheet" href="/PanguText/assets/style-Rgr8LWAc.css">
|
||
<link rel="modulepreload" href="/PanguText/assets/app-6WmjFGj_.js"><link rel="modulepreload" href="/PanguText/assets/android.html-C0sED2vr.js"><link rel="modulepreload" href="/PanguText/assets/android.html-XQpTmuqf.js">
|
||
<link rel="prefetch" href="/PanguText/assets/index.html-EYu-iNkn.js" as="script"><link rel="prefetch" href="/PanguText/assets/index.html-QUZQg0UG.js" as="script"><link rel="prefetch" href="/PanguText/assets/index.html-H__tmzTP.js" as="script"><link rel="prefetch" href="/PanguText/assets/r8-proguard.html-69xTqe-J.js" as="script"><link rel="prefetch" href="/PanguText/assets/about.html-TshJpOH8.js" as="script"><link rel="prefetch" href="/PanguText/assets/changelog.html-_msERpTv.js" as="script"><link rel="prefetch" href="/PanguText/assets/contacts.html-Tyyrr6ry.js" as="script"><link rel="prefetch" href="/PanguText/assets/future.html-YFngAQwd.js" as="script"><link rel="prefetch" href="/PanguText/assets/home.html-JcaZNIqz.js" as="script"><link rel="prefetch" href="/PanguText/assets/quick-start.html-gd9ccG0P.js" as="script"><link rel="prefetch" href="/PanguText/assets/compose.html-ta_OKiQ7.js" as="script"><link rel="prefetch" href="/PanguText/assets/about.html-y0__MDXj.js" as="script"><link rel="prefetch" href="/PanguText/assets/changelog.html-ZdZDMp0S.js" as="script"><link rel="prefetch" href="/PanguText/assets/contacts.html-KJJ9aywK.js" as="script"><link rel="prefetch" href="/PanguText/assets/future.html-H3GTPPFW.js" as="script"><link rel="prefetch" href="/PanguText/assets/r8-proguard.html-D-RxO_Ql.js" as="script"><link rel="prefetch" href="/PanguText/assets/home.html-3yl9a2Vj.js" as="script"><link rel="prefetch" href="/PanguText/assets/quick-start.html-ddi7SydO.js" as="script"><link rel="prefetch" href="/PanguText/assets/android.html-er-PlyuE.js" as="script"><link rel="prefetch" href="/PanguText/assets/compose.html-Bw78KuUV.js" as="script"><link rel="prefetch" href="/PanguText/assets/404.html-6Yl8cQE3.js" as="script"><link rel="prefetch" href="/PanguText/assets/index.html-dAhbvs7X.js" as="script"><link rel="prefetch" href="/PanguText/assets/index.html-hmQ6cGF4.js" as="script"><link rel="prefetch" href="/PanguText/assets/index.html-zXy82L0K.js" as="script"><link rel="prefetch" href="/PanguText/assets/r8-proguard.html-PqTZGCA2.js" as="script"><link rel="prefetch" href="/PanguText/assets/about.html-pwF3sebZ.js" as="script"><link rel="prefetch" href="/PanguText/assets/changelog.html-34En5i-H.js" as="script"><link rel="prefetch" href="/PanguText/assets/contacts.html--fNpIi3D.js" as="script"><link rel="prefetch" href="/PanguText/assets/future.html-e9RoH0aV.js" as="script"><link rel="prefetch" href="/PanguText/assets/home.html-58uN4FuZ.js" as="script"><link rel="prefetch" href="/PanguText/assets/quick-start.html-1kKh8kqs.js" as="script"><link rel="prefetch" href="/PanguText/assets/compose.html-GjfF5jqY.js" as="script"><link rel="prefetch" href="/PanguText/assets/about.html-bq8LJH03.js" as="script"><link rel="prefetch" href="/PanguText/assets/changelog.html-qt_u2gKo.js" as="script"><link rel="prefetch" href="/PanguText/assets/contacts.html-8fmQuQW2.js" as="script"><link rel="prefetch" href="/PanguText/assets/future.html-zvpjuSDl.js" as="script"><link rel="prefetch" href="/PanguText/assets/r8-proguard.html-uJ-Di8s4.js" as="script"><link rel="prefetch" href="/PanguText/assets/home.html-DfgIm_Cu.js" as="script"><link rel="prefetch" href="/PanguText/assets/quick-start.html-SQ1_-HIx.js" as="script"><link rel="prefetch" href="/PanguText/assets/android.html-qjs2U6CQ.js" as="script"><link rel="prefetch" href="/PanguText/assets/compose.html-6IPIfrmc.js" as="script"><link rel="prefetch" href="/PanguText/assets/404.html-YkmvtGWa.js" as="script">
|
||
</head>
|
||
<body>
|
||
<div id="app"><!--[--><div class="theme-container"><!--[--><header class="navbar"><div class="toggle-sidebar-button" title="toggle sidebar" aria-expanded="false" role="button" tabindex="0"><div class="icon" aria-hidden="true"><span></span><span></span><span></span></div></div><span><a href="/PanguText/en/" class=""><img class="logo" src="/PanguText/images/logo.png" alt="Pangu Text"><span class="site-name can-hide">Pangu Text</span></a></span><div class="navbar-items-wrapper" style=""><!--[--><!--]--><nav class="navbar-items can-hide"><!--[--><div class="navbar-item"><div class="navbar-dropdown-wrapper"><button class="navbar-dropdown-title" type="button" aria-label="Navigation"><span class="title">Navigation</span><span class="arrow down"></span></button><button class="navbar-dropdown-title-mobile" type="button" aria-label="Navigation"><span class="title">Navigation</span><span class="right arrow"></span></button><ul style="display:none;" class="navbar-dropdown"><!--[--><li class="navbar-dropdown-item"><!--[--><h4 class="navbar-dropdown-subtitle"><span>Get Started</span></h4><ul class="navbar-dropdown-subitem-wrapper"><!--[--><li class="navbar-dropdown-subitem"><a href="/PanguText/en/guide/home.html" class="" aria-label="Introduction"><!--[--><!--]--> Introduction <!--[--><!--]--></a></li><li class="navbar-dropdown-subitem"><a href="/PanguText/en/guide/quick-start.html" class="" aria-label="Quick Start"><!--[--><!--]--> Quick Start <!--[--><!--]--></a></li><!--]--></ul><!--]--></li><li class="navbar-dropdown-item"><!--[--><h4 class="navbar-dropdown-subtitle"><span>Libraries</span></h4><ul class="navbar-dropdown-subitem-wrapper"><!--[--><li class="navbar-dropdown-subitem"><a aria-current="page" href="/PanguText/en/library/android.html" class="router-link-active router-link-exact-active router-link-active" aria-label="Android"><!--[--><!--]--> Android <!--[--><!--]--></a></li><li class="navbar-dropdown-subitem"><a href="/PanguText/en/library/compose.html" class="" aria-label="Jetpack Compose"><!--[--><!--]--> Jetpack Compose <!--[--><!--]--></a></li><!--]--></ul><!--]--></li><li class="navbar-dropdown-item"><!--[--><h4 class="navbar-dropdown-subtitle"><span>Configs</span></h4><ul class="navbar-dropdown-subitem-wrapper"><!--[--><li class="navbar-dropdown-subitem"><a href="/PanguText/en/config/r8-proguard.html" class="" aria-label="R8 & Proguard Obfuscate"><!--[--><!--]--> R8 & Proguard Obfuscate <!--[--><!--]--></a></li><!--]--></ul><!--]--></li><li class="navbar-dropdown-item"><!--[--><h4 class="navbar-dropdown-subtitle"><span>About</span></h4><ul class="navbar-dropdown-subitem-wrapper"><!--[--><li class="navbar-dropdown-subitem"><a href="/PanguText/en/about/changelog.html" class="" aria-label="Changelog"><!--[--><!--]--> Changelog <!--[--><!--]--></a></li><li class="navbar-dropdown-subitem"><a href="/PanguText/en/about/future.html" class="" aria-label="Looking Toward the Future"><!--[--><!--]--> Looking Toward the Future <!--[--><!--]--></a></li><li class="navbar-dropdown-subitem"><a href="/PanguText/en/about/contacts.html" class="" aria-label="Contact Us"><!--[--><!--]--> Contact Us <!--[--><!--]--></a></li><li class="navbar-dropdown-subitem"><a href="/PanguText/en/about/about.html" class="" aria-label="About This Document"><!--[--><!--]--> About This Document <!--[--><!--]--></a></li><!--]--></ul><!--]--></li><!--]--></ul></div></div><div class="navbar-item"><a href="/PanguText/en/about/contacts" class="" aria-label="Contact Us"><!--[--><!--]--> Contact Us <!--[--><!--]--></a></div><div class="navbar-item"><div class="navbar-dropdown-wrapper"><button class="navbar-dropdown-title" type="button" aria-label="Select language"><span class="title">English (US)</span><span class="arrow down"></span></button><button class="navbar-dropdown-title-mobile" type="button" aria-label="Select language"><span class="title">English (US)</span><span class="right arrow"></span></button><ul style="display:none;" class="navbar-dropdown"><!--[--><li class="navbar-dropdown-item"><a aria-current="page" href="/PanguText/en/library/android.html" class="router-link-active router-link-exact-active router-link-active" aria-label="English"><!--[--><!--]--> English <!--[--><!--]--></a></li><li class="navbar-dropdown-item"><a href="/PanguText/zh-cn/library/android.html" class="" aria-label="简体中文"><!--[--><!--]--> 简体中文 <!--[--><!--]--></a></li><!--]--></ul></div></div><div class="navbar-item"><a class="external-link" href="https://github.com/BetterAndroid/PanguText" rel="noopener noreferrer" target="_blank" aria-label="GitHub"><!--[--><!--]--> GitHub <span><svg class="external-link-icon" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path><polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg><span class="external-link-icon-sr-only">open in new window</span></span><!--[--><!--]--></a></div><!--]--></nav><!--[--><!--]--><button class="toggle-color-mode-button" title="toggle color mode"><svg style="" class="icon" focusable="false" viewBox="0 0 32 32"><path d="M16 12.005a4 4 0 1 1-4 4a4.005 4.005 0 0 1 4-4m0-2a6 6 0 1 0 6 6a6 6 0 0 0-6-6z" fill="currentColor"></path><path d="M5.394 6.813l1.414-1.415l3.506 3.506L8.9 10.318z" fill="currentColor"></path><path d="M2 15.005h5v2H2z" fill="currentColor"></path><path d="M5.394 25.197L8.9 21.691l1.414 1.415l-3.506 3.505z" fill="currentColor"></path><path d="M15 25.005h2v5h-2z" fill="currentColor"></path><path d="M21.687 23.106l1.414-1.415l3.506 3.506l-1.414 1.414z" fill="currentColor"></path><path d="M25 15.005h5v2h-5z" fill="currentColor"></path><path d="M21.687 8.904l3.506-3.506l1.414 1.415l-3.506 3.505z" fill="currentColor"></path><path d="M15 2.005h2v5h-2z" fill="currentColor"></path></svg><svg style="display:none;" class="icon" focusable="false" viewBox="0 0 32 32"><path d="M13.502 5.414a15.075 15.075 0 0 0 11.594 18.194a11.113 11.113 0 0 1-7.975 3.39c-.138 0-.278.005-.418 0a11.094 11.094 0 0 1-3.2-21.584M14.98 3a1.002 1.002 0 0 0-.175.016a13.096 13.096 0 0 0 1.825 25.981c.164.006.328 0 .49 0a13.072 13.072 0 0 0 10.703-5.555a1.01 1.01 0 0 0-.783-1.565A13.08 13.08 0 0 1 15.89 4.38A1.015 1.015 0 0 0 14.98 3z" fill="currentColor"></path></svg></button><form class="search-box" role="search"><input type="search" placeholder="Search" autocomplete="off" spellcheck="false" value><!----></form></div></header><!--]--><div class="sidebar-mask"></div><!--[--><aside class="sidebar"><nav class="navbar-items"><!--[--><div class="navbar-item"><div class="navbar-dropdown-wrapper"><button class="navbar-dropdown-title" type="button" aria-label="Navigation"><span class="title">Navigation</span><span class="arrow down"></span></button><button class="navbar-dropdown-title-mobile" type="button" aria-label="Navigation"><span class="title">Navigation</span><span class="right arrow"></span></button><ul style="display:none;" class="navbar-dropdown"><!--[--><li class="navbar-dropdown-item"><!--[--><h4 class="navbar-dropdown-subtitle"><span>Get Started</span></h4><ul class="navbar-dropdown-subitem-wrapper"><!--[--><li class="navbar-dropdown-subitem"><a href="/PanguText/en/guide/home.html" class="" aria-label="Introduction"><!--[--><!--]--> Introduction <!--[--><!--]--></a></li><li class="navbar-dropdown-subitem"><a href="/PanguText/en/guide/quick-start.html" class="" aria-label="Quick Start"><!--[--><!--]--> Quick Start <!--[--><!--]--></a></li><!--]--></ul><!--]--></li><li class="navbar-dropdown-item"><!--[--><h4 class="navbar-dropdown-subtitle"><span>Libraries</span></h4><ul class="navbar-dropdown-subitem-wrapper"><!--[--><li class="navbar-dropdown-subitem"><a aria-current="page" href="/PanguText/en/library/android.html" class="router-link-active router-link-exact-active router-link-active" aria-label="Android"><!--[--><!--]--> Android <!--[--><!--]--></a></li><li class="navbar-dropdown-subitem"><a href="/PanguText/en/library/compose.html" class="" aria-label="Jetpack Compose"><!--[--><!--]--> Jetpack Compose <!--[--><!--]--></a></li><!--]--></ul><!--]--></li><li class="navbar-dropdown-item"><!--[--><h4 class="navbar-dropdown-subtitle"><span>Configs</span></h4><ul class="navbar-dropdown-subitem-wrapper"><!--[--><li class="navbar-dropdown-subitem"><a href="/PanguText/en/config/r8-proguard.html" class="" aria-label="R8 & Proguard Obfuscate"><!--[--><!--]--> R8 & Proguard Obfuscate <!--[--><!--]--></a></li><!--]--></ul><!--]--></li><li class="navbar-dropdown-item"><!--[--><h4 class="navbar-dropdown-subtitle"><span>About</span></h4><ul class="navbar-dropdown-subitem-wrapper"><!--[--><li class="navbar-dropdown-subitem"><a href="/PanguText/en/about/changelog.html" class="" aria-label="Changelog"><!--[--><!--]--> Changelog <!--[--><!--]--></a></li><li class="navbar-dropdown-subitem"><a href="/PanguText/en/about/future.html" class="" aria-label="Looking Toward the Future"><!--[--><!--]--> Looking Toward the Future <!--[--><!--]--></a></li><li class="navbar-dropdown-subitem"><a href="/PanguText/en/about/contacts.html" class="" aria-label="Contact Us"><!--[--><!--]--> Contact Us <!--[--><!--]--></a></li><li class="navbar-dropdown-subitem"><a href="/PanguText/en/about/about.html" class="" aria-label="About This Document"><!--[--><!--]--> About This Document <!--[--><!--]--></a></li><!--]--></ul><!--]--></li><!--]--></ul></div></div><div class="navbar-item"><a href="/PanguText/en/about/contacts" class="" aria-label="Contact Us"><!--[--><!--]--> Contact Us <!--[--><!--]--></a></div><div class="navbar-item"><div class="navbar-dropdown-wrapper"><button class="navbar-dropdown-title" type="button" aria-label="Select language"><span class="title">English (US)</span><span class="arrow down"></span></button><button class="navbar-dropdown-title-mobile" type="button" aria-label="Select language"><span class="title">English (US)</span><span class="right arrow"></span></button><ul style="display:none;" class="navbar-dropdown"><!--[--><li class="navbar-dropdown-item"><a aria-current="page" href="/PanguText/en/library/android.html" class="router-link-active router-link-exact-active router-link-active" aria-label="English"><!--[--><!--]--> English <!--[--><!--]--></a></li><li class="navbar-dropdown-item"><a href="/PanguText/zh-cn/library/android.html" class="" aria-label="简体中文"><!--[--><!--]--> 简体中文 <!--[--><!--]--></a></li><!--]--></ul></div></div><div class="navbar-item"><a class="external-link" href="https://github.com/BetterAndroid/PanguText" rel="noopener noreferrer" target="_blank" aria-label="GitHub"><!--[--><!--]--> GitHub <span><svg class="external-link-icon" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path><polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg><span class="external-link-icon-sr-only">open in new window</span></span><!--[--><!--]--></a></div><!--]--></nav><!--[--><!--]--><ul class="sidebar-items"><!--[--><li><p tabindex="0" class="sidebar-item sidebar-heading collapsible">Get Started <span class="right arrow"></span></p><ul style="display:none;" class="sidebar-item-children"><!--[--><li><a href="/PanguText/en/guide/home.html" class="sidebar-item" aria-label="Introduction"><!--[--><!--]--> Introduction <!--[--><!--]--></a><!----></li><li><a href="/PanguText/en/guide/quick-start.html" class="sidebar-item" aria-label="Quick Start"><!--[--><!--]--> Quick Start <!--[--><!--]--></a><!----></li><!--]--></ul></li><li><p tabindex="0" class="sidebar-item sidebar-heading active collapsible">Libraries <span class="down arrow"></span></p><ul style="" class="sidebar-item-children"><!--[--><li><a aria-current="page" href="/PanguText/en/library/android.html" class="router-link-active router-link-exact-active router-link-active sidebar-item active" aria-label="Android"><!--[--><!--]--> Android <!--[--><!--]--></a><ul style="" class="sidebar-item-children"><!--[--><li><a aria-current="page" href="/PanguText/en/library/android.html#configure-dependency" class="router-link-active router-link-exact-active sidebar-item" aria-label="Configure Dependency"><!--[--><!--]--> Configure Dependency <!--[--><!--]--></a><ul style="" class="sidebar-item-children"><!--[--><li><a aria-current="page" href="/PanguText/en/library/android.html#sweetdependency-recommended" class="router-link-active router-link-exact-active sidebar-item" aria-label="SweetDependency (Recommended)"><!--[--><!--]--> SweetDependency (Recommended) <!--[--><!--]--></a><!----></li><li><a aria-current="page" href="/PanguText/en/library/android.html#version-catalog" class="router-link-active router-link-exact-active sidebar-item" aria-label="Version Catalog"><!--[--><!--]--> Version Catalog <!--[--><!--]--></a><!----></li><li><a aria-current="page" href="/PanguText/en/library/android.html#traditional-method" class="router-link-active router-link-exact-active sidebar-item" aria-label="Traditional Method"><!--[--><!--]--> Traditional Method <!--[--><!--]--></a><!----></li><!--]--></ul></li><li><a aria-current="page" href="/PanguText/en/library/android.html#function-introduction" class="router-link-active router-link-exact-active sidebar-item" aria-label="Function Introduction"><!--[--><!--]--> Function Introduction <!--[--><!--]--></a><ul style="" class="sidebar-item-children"><!--[--><li><a aria-current="page" href="/PanguText/en/library/android.html#implementation-principle" class="router-link-active router-link-exact-active sidebar-item" aria-label="Implementation Principle"><!--[--><!--]--> Implementation Principle <!--[--><!--]--></a><!----></li><li><a aria-current="page" href="/PanguText/en/library/android.html#integrate-into-existing-projects" class="router-link-active router-link-exact-active sidebar-item" aria-label="Integrate into Existing Projects"><!--[--><!--]--> Integrate into Existing Projects <!--[--><!--]--></a><!----></li><li><a aria-current="page" href="/PanguText/en/library/android.html#personalized-configuration" class="router-link-active router-link-exact-active sidebar-item" aria-label="Personalized Configuration"><!--[--><!--]--> Personalized Configuration <!--[--><!--]--></a><!----></li><!--]--></ul></li><!--]--></ul></li><li><a href="/PanguText/en/library/compose.html" class="sidebar-item" aria-label="Jetpack Compose"><!--[--><!--]--> Jetpack Compose <!--[--><!--]--></a><!----></li><!--]--></ul></li><li><p tabindex="0" class="sidebar-item sidebar-heading collapsible">Configs <span class="right arrow"></span></p><ul style="display:none;" class="sidebar-item-children"><!--[--><li><a href="/PanguText/en/config/r8-proguard.html" class="sidebar-item" aria-label="R8 & Proguard Obfuscate"><!--[--><!--]--> R8 & Proguard Obfuscate <!--[--><!--]--></a><!----></li><!--]--></ul></li><li><p tabindex="0" class="sidebar-item sidebar-heading collapsible">About <span class="right arrow"></span></p><ul style="display:none;" class="sidebar-item-children"><!--[--><li><a href="/PanguText/en/about/changelog.html" class="sidebar-item" aria-label="Changelog"><!--[--><!--]--> Changelog <!--[--><!--]--></a><!----></li><li><a href="/PanguText/en/about/future.html" class="sidebar-item" aria-label="Looking Toward the Future"><!--[--><!--]--> Looking Toward the Future <!--[--><!--]--></a><!----></li><li><a href="/PanguText/en/about/contacts.html" class="sidebar-item" aria-label="Contact Us"><!--[--><!--]--> Contact Us <!--[--><!--]--></a><!----></li><li><a href="/PanguText/en/about/about.html" class="sidebar-item" aria-label="About This Document"><!--[--><!--]--> About This Document <!--[--><!--]--></a><!----></li><!--]--></ul></li><!--]--></ul><!--[--><!--]--></aside><!--]--><!--[--><main class="page"><!--[--><!--]--><div class="theme-default-content"><!--[--><!--]--><div><h1 id="android" tabindex="-1"><a class="header-anchor" href="#android" aria-hidden="true">#</a> Android</h1><p><img src="https://img.shields.io/maven-central/v/com.highcapable.pangutext/pangutext-android?logo=apachemaven&logoColor=orange&style=flat-square" alt="Maven Central"><span style="margin-left:5px;"></span><img src="https://img.shields.io/maven-metadata/v?metadataUrl=https%3A%2F%2Fraw.githubusercontent.com%2FHighCapable%2Fmaven-repository%2Frefs%2Fheads%2Fmain%2Frepository%2Freleases%2Fcom%2Fhighcapable%2Fpangutext%2Fpangutext-android%2Fmaven-metadata.xml&logo=apachemaven&logoColor=orange&label=highcapable-maven-releases&style=flat-square" alt="Maven metadata URL"><span style="margin-left:5px;"></span><img src="https://img.shields.io/badge/Min SDK-21-orange?logo=android&style=flat-square" alt="Android Min SDK"></p><p>This is the core dependency for the Android platform. When using <code>PanguText</code> on Android, you need to include this module.</p><h2 id="configure-dependency" tabindex="-1"><a class="header-anchor" href="#configure-dependency" aria-hidden="true">#</a> Configure Dependency</h2><p>You can add this module to your project using the following method.</p><h3 id="sweetdependency-recommended" tabindex="-1"><a class="header-anchor" href="#sweetdependency-recommended" aria-hidden="true">#</a> SweetDependency (Recommended)</h3><p>Add dependency in your project's <code>SweetDependency</code> configuration file.</p><div class="language-yaml line-numbers-mode" data-ext="yml"><pre class="shiki github-dark-dimmed" style="background-color:#22272e;" tabindex="0"><code><span class="line"><span style="color:#8DDB8C;">libraries</span><span style="color:#ADBAC7;">:</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#8DDB8C;">com.highcapable.pangutext</span><span style="color:#ADBAC7;">:</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#8DDB8C;">pangutext-android</span><span style="color:#ADBAC7;">:</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#8DDB8C;">version</span><span style="color:#ADBAC7;">: </span><span style="color:#96D0FF;">+</span></span>
|
||
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>Configure dependency in your project's <code>build.gradle.kts</code>.</p><div class="language-kotlin line-numbers-mode" data-ext="kt"><pre class="shiki github-dark-dimmed" style="background-color:#22272e;" tabindex="0"><code><span class="line"><span style="color:#DCBDFB;">implementation</span><span style="color:#ADBAC7;">(com.highcapable.pangutext.pangutext.android)</span></span>
|
||
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><h3 id="version-catalog" tabindex="-1"><a class="header-anchor" href="#version-catalog" aria-hidden="true">#</a> Version Catalog</h3><p>Add dependency in your project's <code>gradle/libs.versions.toml</code>.</p><div class="language-toml line-numbers-mode" data-ext="toml"><pre class="shiki github-dark-dimmed" style="background-color:#22272e;" tabindex="0"><code><span class="line"><span style="color:#ADBAC7;">[</span><span style="color:#F69D50;">versions</span><span style="color:#ADBAC7;">]</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;">pangutext-android = </span><span style="color:#96D0FF;">"<version>"</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="color:#ADBAC7;">[</span><span style="color:#F69D50;">libraries</span><span style="color:#ADBAC7;">]</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;">pangutext-android = { module = </span><span style="color:#96D0FF;">"com.highcapable.pangutext:pangutext-android"</span><span style="color:#ADBAC7;">, version.ref = </span><span style="color:#96D0FF;">"pangutext-android"</span><span style="color:#ADBAC7;"> }</span></span>
|
||
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>Configure dependency in your project's <code>build.gradle.kts</code>.</p><div class="language-kotlin line-numbers-mode" data-ext="kt"><pre class="shiki github-dark-dimmed" style="background-color:#22272e;" tabindex="0"><code><span class="line"><span style="color:#DCBDFB;">implementation</span><span style="color:#ADBAC7;">(libs.pangutext.android)</span></span>
|
||
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>Please change <code><version></code> to the version displayed at the top of this document.</p><h3 id="traditional-method" tabindex="-1"><a class="header-anchor" href="#traditional-method" aria-hidden="true">#</a> Traditional Method</h3><p>Configure dependency in your project's <code>build.gradle.kts</code>.</p><div class="language-kotlin line-numbers-mode" data-ext="kt"><pre class="shiki github-dark-dimmed" style="background-color:#22272e;" tabindex="0"><code><span class="line"><span style="color:#DCBDFB;">implementation</span><span style="color:#ADBAC7;">(</span><span style="color:#96D0FF;">"com.highcapable.pangutext:pangutext-android:<version>"</span><span style="color:#ADBAC7;">)</span></span>
|
||
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><p>Please change <code><version></code> to the version displayed at the top of this document.</p><h2 id="function-introduction" tabindex="-1"><a class="header-anchor" href="#function-introduction" aria-hidden="true">#</a> Function Introduction</h2><p>You can view the KDoc <a href="https://betterandroid.github.io/PanguText/KDoc/pangutext-android" target="_blank" rel="noopener noreferrer">click here<span><svg class="external-link-icon" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path><polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg><span class="external-link-icon-sr-only">open in new window</span></span></a>.</p><h3 id="implementation-principle" tabindex="-1"><a class="header-anchor" href="#implementation-principle" aria-hidden="true">#</a> Implementation Principle</h3><p><code>PanguText</code> provides two methods for text formatting on the Android platform: <code>SpannableString</code> (does not alter the original text length) and direct insertion of whitespace characters (alters the original text length).</p><p>The first method, <code>SpannableString</code>, adds a <code>Span</code> with spacing to the character before the one that needs spacing, changing the text style without altering the string content. The rendering is done by the <code>TextView</code> layer (or manually using <code>TextPaint</code> based on <code>Spanned</code> for layout styling), achieving non-intrusive text styling.</p><p>This method also supports processing already styled text (<code>Spanned</code>), such as text created via <code>Html.fromHtml</code>.</p><p><strong>However, it is currently experimental and may still have unexpected style errors</strong>. You can refer to the <a href="#personalized-configuration">Personalized Configuration</a> section below to disable it.</p><p>The dynamic application (injection) feature mainly targets the input state of <code>EditText</code>. It sets a custom <code>TextWatcher</code> for <code>EditText</code> to monitor input changes and formats the text from <code>afterTextChanged</code>.</p><p>The second method directly inserts whitespace characters after the characters that need spacing. This method alters the original text length and content but does not rely on the <code>TextView</code> layer for rendering. It uses <code>TextPaint</code> to draw the text directly, suitable for all scenarios, <strong>but does not support dynamic application (injection)</strong>.</p><div class="custom-container warning"><p class="custom-container-title">Unresolved Issues</p><p><code>PanguText</code> may conflict with Material components like <code>TextInputEditText</code>, <code>MaterialAutoCompleteTextView</code>, and <code>TextInputLayout</code> when using <code>setHint</code>, as <code>TextView</code> does not account for <code>Span</code> during measurement. This issue is particularly noticeable in single-line text, and there is no solution yet. Use these components cautiously.</p><p>Due to the above issue, calculating the width of a <code>TextView</code> with <code>PanguText</code> style using the <code>View.measure</code> method may also result in errors.</p><p><code>PanguText</code> currently cannot handle continuous characters like underlines or strikethroughs in <code>Spanned</code> text, as the lines will break after adding spacing. It may also cause style errors or fail to apply styles correctly to some special characters. For stability, avoid enabling <code>PanguText</code> for very complex rich text or refer to the <a href="#personalized-configuration">Personalized Configuration</a> section to set <code>excludePatterns</code>.</p></div><h3 id="integrate-into-existing-projects" tabindex="-1"><a class="header-anchor" href="#integrate-into-existing-projects" aria-hidden="true">#</a> Integrate into Existing Projects</h3><p>Integrating <code>PanguText</code> into your current project is very easy. You don't need to change much code. Choose your preferred method below to complete the integration.</p><h4 id="inject-to-layoutinflater" tabindex="-1"><a class="header-anchor" href="#inject-to-layoutinflater" aria-hidden="true">#</a> Inject to LayoutInflater</h4><p><code>PanguText</code> supports direct injection of <code>LayoutInflater.Factory2</code> or creating a <code>LayoutInflater.Factory2</code> instance for the current <code>Activity</code> to take over the entire view layout inflation. This is the recommended integration method, as it allows for non-intrusive and quick integration without modifying any existing layouts.</p><blockquote><p>The following example</p></blockquote><div class="language-kotlin line-numbers-mode" data-ext="kt"><pre class="shiki github-dark-dimmed" style="background-color:#22272e;" tabindex="0"><code><span class="line"><span style="color:#F47067;">class</span><span style="color:#ADBAC7;"> </span><span style="color:#F69D50;">MainActivity</span><span style="color:#ADBAC7;"> : </span><span style="color:#F69D50;">AppCompatActivity</span><span style="color:#ADBAC7;">() {</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#F47067;">val</span><span style="color:#ADBAC7;"> binding </span><span style="color:#F47067;">by</span><span style="color:#ADBAC7;"> </span><span style="color:#DCBDFB;">lazy</span><span style="color:#ADBAC7;"> { ActivityMainBinding.</span><span style="color:#DCBDFB;">inflate</span><span style="color:#ADBAC7;">(layoutInflater) }</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#F47067;">override</span><span style="color:#ADBAC7;"> </span><span style="color:#F47067;">fun</span><span style="color:#ADBAC7;"> </span><span style="color:#DCBDFB;">onCreate</span><span style="color:#ADBAC7;">(savedInstanceState: </span><span style="color:#F69D50;">Bundle</span><span style="color:#ADBAC7;">?) {</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#6CB6FF;">super</span><span style="color:#ADBAC7;">.</span><span style="color:#DCBDFB;">onCreate</span><span style="color:#ADBAC7;">(savedInstanceState)</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#768390;">// Inject here.</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> PanguTextFactory2.</span><span style="color:#DCBDFB;">inject</span><span style="color:#ADBAC7;">(</span><span style="color:#6CB6FF;">this</span><span style="color:#ADBAC7;">)</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#DCBDFB;">setContentView</span><span style="color:#ADBAC7;">(binding.root)</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> }</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;">}</span></span>
|
||
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><div class="custom-container tip"><p class="custom-container-title">Tips</p><p>Since <code>LayoutInflater.Factory2</code> is taken over, recycled layouts like <code>ListView</code> and <code>RecyclerView</code> can also be correctly handled.</p><p>After injecting the <code>LayoutInflater</code> instance in the <code>Activity</code>, the following instances attached to the current <code>Context</code> will automatically take effect:</p><ul><li><code>Fragment</code></li><li><code>Dialog</code></li><li><code>PopupWindow</code></li><li><code>Toast</code> (foreground only in higher system versions)</li></ul><p>Layouts based on <code>RemoteView</code> will not take effect because they are remote objects and do not use the current <code>Context</code>'s <code>LayoutInflater</code> for layout inflation.</p></div><p>If you are using <a href="https://betterandroid.github.io/BetterAndroid/KDoc/ui-component/ui-component/com.highcapable.betterandroid.ui.component.activity/-app-binding-activity" target="_blank" rel="noopener noreferrer">ui-component → AppBindingActivity<span><svg class="external-link-icon" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path><polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg><span class="external-link-icon-sr-only">open in new window</span></span></a> in <code>BetterAndroid</code>, you need to slightly modify the current code.</p><blockquote><p>The following example</p></blockquote><div class="language-kotlin line-numbers-mode" data-ext="kt"><pre class="shiki github-dark-dimmed" style="background-color:#22272e;" tabindex="0"><code><span class="line"><span style="color:#F47067;">class</span><span style="color:#ADBAC7;"> </span><span style="color:#F69D50;">MainActivity</span><span style="color:#ADBAC7;"> : </span><span style="color:#F69D50;">AppBindingActivity</span><span style="color:#ADBAC7;"><</span><span style="color:#F69D50;">ActivityMainBinding</span><span style="color:#ADBAC7;">>() {</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#F47067;">override</span><span style="color:#ADBAC7;"> </span><span style="color:#F47067;">fun</span><span style="color:#ADBAC7;"> </span><span style="color:#DCBDFB;">onPrepareContentView</span><span style="color:#ADBAC7;">(savedInstanceState: </span><span style="color:#F69D50;">Bundle</span><span style="color:#ADBAC7;">?): </span><span style="color:#F69D50;">LayoutInflater</span><span style="color:#ADBAC7;"> {</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#F47067;">val</span><span style="color:#ADBAC7;"> inflater </span><span style="color:#F47067;">=</span><span style="color:#ADBAC7;"> </span><span style="color:#6CB6FF;">super</span><span style="color:#ADBAC7;">.</span><span style="color:#DCBDFB;">onPrepareContentView</span><span style="color:#ADBAC7;">(savedInstanceState)</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#768390;">// Inject here.</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> PanguTextFactory2.</span><span style="color:#DCBDFB;">inject</span><span style="color:#ADBAC7;">(inflater)</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#F47067;">return</span><span style="color:#ADBAC7;"> inflater</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> }</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> </span></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#F47067;">override</span><span style="color:#ADBAC7;"> </span><span style="color:#F47067;">fun</span><span style="color:#ADBAC7;"> </span><span style="color:#DCBDFB;">onCreate</span><span style="color:#ADBAC7;">(savedInstanceState: </span><span style="color:#F69D50;">Bundle</span><span style="color:#ADBAC7;">?) {</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#6CB6FF;">super</span><span style="color:#ADBAC7;">.</span><span style="color:#DCBDFB;">onCreate</span><span style="color:#ADBAC7;">(savedInstanceState)</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#768390;">// Your code here.</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> }</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;">}</span></span>
|
||
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>If your application does not use <code>AppCompatActivity</code> or <code>ViewBinding</code>, don't worry, you can still use the original method.</p><blockquote><p>The following example</p></blockquote><div class="language-kotlin line-numbers-mode" data-ext="kt"><pre class="shiki github-dark-dimmed" style="background-color:#22272e;" tabindex="0"><code><span class="line"><span style="color:#F47067;">class</span><span style="color:#ADBAC7;"> </span><span style="color:#F69D50;">MainActivity</span><span style="color:#ADBAC7;"> : </span><span style="color:#F69D50;">Activity</span><span style="color:#ADBAC7;">() {</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#F47067;">override</span><span style="color:#ADBAC7;"> </span><span style="color:#F47067;">fun</span><span style="color:#ADBAC7;"> </span><span style="color:#DCBDFB;">onCreate</span><span style="color:#ADBAC7;">(savedInstanceState: </span><span style="color:#F69D50;">Bundle</span><span style="color:#ADBAC7;">?) {</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#6CB6FF;">super</span><span style="color:#ADBAC7;">.</span><span style="color:#DCBDFB;">onCreate</span><span style="color:#ADBAC7;">(savedInstanceState)</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#768390;">// Inject here.</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> PanguTextFactory2.</span><span style="color:#DCBDFB;">inject</span><span style="color:#ADBAC7;">(</span><span style="color:#6CB6FF;">this</span><span style="color:#ADBAC7;">)</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#DCBDFB;">setContentView</span><span style="color:#ADBAC7;">(R.layout.activity_main)</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> }</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;">}</span></span>
|
||
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><div class="custom-container tip"><p class="custom-container-title">Tips</p><p><code>PanguTextFactory2</code> can be used not only with <code>Activity</code> but also injected into any existing <code>LayoutInflater</code> instance. However, please inject it before the <code>LayoutInflater</code> instance is used to inflate the layout, otherwise it will not take effect.</p></div><h4 id="using-the-patching-tool" tabindex="-1"><a class="header-anchor" href="#using-the-patching-tool" aria-hidden="true">#</a> Using the Patching Tool</h4><p>You can use <code>PanguTextPatcher</code> to patch existing <code>View</code> or <code>ViewGroup</code> instances.</p><p>Patch the entire root layout, and <code>PanguTextPatcher</code> will automatically patch all <code>TextView</code> instances or their subclasses under the root layout.</p><blockquote><p>The following example</p></blockquote><div class="language-kotlin line-numbers-mode" data-ext="kt"><pre class="shiki github-dark-dimmed" style="background-color:#22272e;" tabindex="0"><code><span class="line"><span style="color:#768390;">// Assume you have a root layout.</span></span>
|
||
<span class="line"><span style="color:#F47067;">val</span><span style="color:#ADBAC7;"> root: </span><span style="color:#F69D50;">ViewGroup</span></span>
|
||
<span class="line"><span style="color:#768390;">// Patch the root layout.</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;">PanguTextPatcher.</span><span style="color:#DCBDFB;">patch</span><span style="color:#ADBAC7;">(root)</span></span>
|
||
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>Patch a single <code>View</code>, which is of type <code>TextView</code> or a subclass of <code>TextView</code>.</p><blockquote><p>The following example</p></blockquote><div class="language-kotlin line-numbers-mode" data-ext="kt"><pre class="shiki github-dark-dimmed" style="background-color:#22272e;" tabindex="0"><code><span class="line"><span style="color:#768390;">// Assume this is your TextView.</span></span>
|
||
<span class="line"><span style="color:#F47067;">val</span><span style="color:#ADBAC7;"> textView: </span><span style="color:#F69D50;">TextView</span></span>
|
||
<span class="line"><span style="color:#768390;">// Patch a single View.</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;">PanguTextPatcher.</span><span style="color:#DCBDFB;">patch</span><span style="color:#ADBAC7;">(textView)</span></span>
|
||
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><div class="custom-container warning"><p class="custom-container-title">Notice</p><p>When using <code>PanguTextPatcher</code> in recycled layouts such as <code>RecyclerView</code>, <code>ListView</code>, or <code>ViewPager</code>, you need to patch the <code>itemView</code> in <code>onCreateViewHolder</code> or <code>onBindViewHolder</code>, otherwise it will not take effect.</p></div><h4 id="manual-injection-or-text-formatting" tabindex="-1"><a class="header-anchor" href="#manual-injection-or-text-formatting" aria-hidden="true">#</a> Manual Injection or Text Formatting</h4><p><code>PanguText</code> also supports manual injection, allowing you to inject it into the desired <code>TextView</code> or <code>EditText</code>.</p><blockquote><p>The following example</p></blockquote><div class="language-kotlin line-numbers-mode" data-ext="kt"><pre class="shiki github-dark-dimmed" style="background-color:#22272e;" tabindex="0"><code><span class="line"><span style="color:#768390;">// Assume this is your TextView.</span></span>
|
||
<span class="line"><span style="color:#F47067;">val</span><span style="color:#ADBAC7;"> textView: </span><span style="color:#F69D50;">TextView</span></span>
|
||
<span class="line"><span style="color:#768390;">// Assume this is your EditText.</span></span>
|
||
<span class="line"><span style="color:#F47067;">val</span><span style="color:#ADBAC7;"> editText: </span><span style="color:#F69D50;">EditText</span></span>
|
||
<span class="line"><span style="color:#768390;">// Inject into existing text.</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;">textView.</span><span style="color:#DCBDFB;">injectPanguText</span><span style="color:#ADBAC7;">()</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;">editText.</span><span style="color:#DCBDFB;">injectPanguText</span><span style="color:#ADBAC7;">()</span></span>
|
||
<span class="line"><span style="color:#768390;">// Optionally choose whether to inject Hint (default is true).</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;">textView.</span><span style="color:#DCBDFB;">injectPanguText</span><span style="color:#ADBAC7;">(injectHint </span><span style="color:#F47067;">=</span><span style="color:#ADBAC7;"> </span><span style="color:#6CB6FF;">false</span><span style="color:#ADBAC7;">)</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;">editText.</span><span style="color:#DCBDFB;">injectPanguText</span><span style="color:#ADBAC7;">(injectHint </span><span style="color:#F47067;">=</span><span style="color:#ADBAC7;"> </span><span style="color:#6CB6FF;">false</span><span style="color:#ADBAC7;">)</span></span>
|
||
<span class="line"><span style="color:#768390;">// Dynamic injection, re-calling setText will automatically take effect.</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;">textView.</span><span style="color:#DCBDFB;">injectRealTimePanguText</span><span style="color:#ADBAC7;">()</span></span>
|
||
<span class="line"><span style="color:#768390;">// Dynamic injection mainly targets the input state of EditText.</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;">editText.</span><span style="color:#DCBDFB;">injectRealTimePanguText</span><span style="color:#ADBAC7;">()</span></span>
|
||
<span class="line"><span style="color:#768390;">// Optionally choose whether to inject Hint (default is true).</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;">textView.</span><span style="color:#DCBDFB;">injectRealTimePanguText</span><span style="color:#ADBAC7;">(injectHint </span><span style="color:#F47067;">=</span><span style="color:#ADBAC7;"> </span><span style="color:#6CB6FF;">false</span><span style="color:#ADBAC7;">)</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;">editText.</span><span style="color:#DCBDFB;">injectRealTimePanguText</span><span style="color:#ADBAC7;">(injectHint </span><span style="color:#F47067;">=</span><span style="color:#ADBAC7;"> </span><span style="color:#6CB6FF;">false</span><span style="color:#ADBAC7;">)</span></span>
|
||
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p><code>PanguText</code> also extends the <code>setText</code> method of <code>TextView</code>, allowing you to directly set text with <code>PanguText</code> style.</p><blockquote><p>The following example</p></blockquote><div class="language-kotlin line-numbers-mode" data-ext="kt"><pre class="shiki github-dark-dimmed" style="background-color:#22272e;" tabindex="0"><code><span class="line"><span style="color:#768390;">// Assume this is your TextView.</span></span>
|
||
<span class="line"><span style="color:#F47067;">val</span><span style="color:#ADBAC7;"> textView: </span><span style="color:#F69D50;">TextView</span></span>
|
||
<span class="line"><span style="color:#768390;">// Set text with PanguText style.</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;">textView.</span><span style="color:#DCBDFB;">setTextWithPangu</span><span style="color:#ADBAC7;">(</span><span style="color:#96D0FF;">"Xiaoming今年16岁"</span><span style="color:#ADBAC7;">)</span></span>
|
||
<span class="line"><span style="color:#768390;">// Set Hint with PanguText style.</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;">textView.</span><span style="color:#DCBDFB;">setHintWithPangu</span><span style="color:#ADBAC7;">(</span><span style="color:#96D0FF;">"输入Xiaoming的年龄"</span><span style="color:#ADBAC7;">)</span></span>
|
||
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>You can also use the <code>PanguText.format</code> method to directly format text.</p><blockquote><p>The following example</p></blockquote><div class="language-kotlin line-numbers-mode" data-ext="kt"><pre class="shiki github-dark-dimmed" style="background-color:#22272e;" tabindex="0"><code><span class="line"><span style="color:#768390;">// Assume this is your TextView.</span></span>
|
||
<span class="line"><span style="color:#F47067;">val</span><span style="color:#ADBAC7;"> textView: </span><span style="color:#F69D50;">TextView</span></span>
|
||
<span class="line"><span style="color:#768390;">// Format text using SpannableString method.</span></span>
|
||
<span class="line"><span style="color:#768390;">// Requires passing the current TextView's Resources and text size.</span></span>
|
||
<span class="line"><span style="color:#768390;">// If the input text is already Spannable,</span></span>
|
||
<span class="line"><span style="color:#768390;">// it will return the original object without creating a new SpannableString.</span></span>
|
||
<span class="line"><span style="color:#F47067;">val</span><span style="color:#ADBAC7;"> text </span><span style="color:#F47067;">=</span><span style="color:#ADBAC7;"> PanguText.</span><span style="color:#DCBDFB;">format</span><span style="color:#ADBAC7;">(textView.resources, textView.textSize, </span><span style="color:#96D0FF;">"Xiaoming今年16岁"</span><span style="color:#ADBAC7;">)</span></span>
|
||
<span class="line"><span style="color:#768390;">// Set text.</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;">textView.text </span><span style="color:#F47067;">=</span><span style="color:#ADBAC7;"> text</span></span>
|
||
<span class="line"><span style="color:#768390;">// Directly format text using whitespace characters for insertion.</span></span>
|
||
<span class="line"><span style="color:#768390;">// This method adds extra whitespace characters " " (HSP) to the text.</span></span>
|
||
<span class="line"><span style="color:#768390;">// The result below will output the string "Xiaoming 今年 16 岁".</span></span>
|
||
<span class="line"><span style="color:#768390;">// You can also customize the whitespace character at the end of the method.</span></span>
|
||
<span class="line"><span style="color:#F47067;">val</span><span style="color:#ADBAC7;"> text </span><span style="color:#F47067;">=</span><span style="color:#ADBAC7;"> PanguText.</span><span style="color:#DCBDFB;">format</span><span style="color:#ADBAC7;">(</span><span style="color:#96D0FF;">"Xiaoming今年16岁"</span><span style="color:#ADBAC7;">)</span></span>
|
||
<span class="line"><span style="color:#768390;">// Set text.</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;">textView.text </span><span style="color:#F47067;">=</span><span style="color:#ADBAC7;"> text</span></span>
|
||
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><div class="custom-container tip"><p class="custom-container-title">Tips</p><p>The <code>injectPanguText</code>, <code>injectRealTimePanguText</code>, <code>setTextWithPangu</code>, <code>setHintWithPangu</code>, and <code>PanguText.format</code> methods support the <code>config</code> parameter. You can refer to the <a href="#personalized-configuration">Personalized Configuration</a> section below.</p></div><h4 id="custom-view" tabindex="-1"><a class="header-anchor" href="#custom-view" aria-hidden="true">#</a> Custom View</h4><p><code>PanguText</code> can also be used with custom <code>View</code>. You can extend your <code>View</code> to <code>AppCompatTextView</code> and override the <code>setText</code> method.</p><blockquote><p>The following example</p></blockquote><div class="language-kotlin line-numbers-mode" data-ext="kt"><pre class="shiki github-dark-dimmed" style="background-color:#22272e;" tabindex="0"><code><span class="line"><span style="color:#F47067;">class</span><span style="color:#ADBAC7;"> </span><span style="color:#F69D50;">MyTextView</span><span style="color:#ADBAC7;">(context: </span><span style="color:#F69D50;">Context</span><span style="color:#ADBAC7;">, attrs: </span><span style="color:#F69D50;">AttributeSet</span><span style="color:#ADBAC7;">? </span><span style="color:#F47067;">=</span><span style="color:#ADBAC7;"> </span><span style="color:#6CB6FF;">null</span><span style="color:#ADBAC7;">) : </span><span style="color:#F69D50;">AppCompatTextView</span><span style="color:#ADBAC7;">(</span><span style="color:#F69D50;">context</span><span style="color:#ADBAC7;">, </span><span style="color:#F69D50;">attrs</span><span style="color:#ADBAC7;">) {</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#F47067;">override</span><span style="color:#ADBAC7;"> </span><span style="color:#F47067;">fun</span><span style="color:#ADBAC7;"> </span><span style="color:#DCBDFB;">setText</span><span style="color:#ADBAC7;">(text: </span><span style="color:#F69D50;">CharSequence</span><span style="color:#ADBAC7;">?, type: </span><span style="color:#F69D50;">BufferType</span><span style="color:#ADBAC7;">?) {</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#768390;">// Manually inject here.</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#F47067;">val</span><span style="color:#ADBAC7;"> panguText </span><span style="color:#F47067;">=</span><span style="color:#ADBAC7;"> text?.</span><span style="color:#DCBDFB;">let</span><span style="color:#ADBAC7;"> { PanguText.</span><span style="color:#DCBDFB;">format</span><span style="color:#ADBAC7;">(resources, textSize, it) }</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#6CB6FF;">super</span><span style="color:#ADBAC7;">.</span><span style="color:#DCBDFB;">setText</span><span style="color:#ADBAC7;">(panguText, type)</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> }</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;">}</span></span>
|
||
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><div class="custom-container warning"><p class="custom-container-title">Notice</p><p>After injecting <code>PanguText</code> into <code>TextView</code>, if you use <code>android:singleLine="true"</code> in XML layout or <code>TextView.setSingleLine(true)</code> in code along with <code>android:ellipsize="..."</code>, this method of setting single-line text may cause unresolvable <code>OBJ</code> characters (truncated by ellipsis) to appear when the text exceeds the screen width, because <code>TextView</code> does not account for <code>Span</code> during measurement, leading to incorrect text width calculation.</p><p>The solution is to use <code>android:maxLines="1"</code> in XML layout or <code>TextView.setMaxLines(1)</code> in code instead.</p><blockquote><p>The following example</p></blockquote><div class="language-xml line-numbers-mode" data-ext="xml"><pre class="shiki github-dark-dimmed" style="background-color:#22272e;" tabindex="0"><code><span class="line"><span style="color:#ADBAC7;"><</span><span style="color:#8DDB8C;">TextView</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#6CB6FF;">android:id</span><span style="color:#ADBAC7;">=</span><span style="color:#96D0FF;">"@+id/text"</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#6CB6FF;">android:layout_width</span><span style="color:#ADBAC7;">=</span><span style="color:#96D0FF;">"wrap_content"</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#6CB6FF;">android:layout_height</span><span style="color:#ADBAC7;">=</span><span style="color:#96D0FF;">"wrap_content"</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#6CB6FF;">android:text</span><span style="color:#ADBAC7;">=</span><span style="color:#96D0FF;">"这是一段很长很长长长长长长长长长长长长还有English混入的的文本"</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#6CB6FF;">android:maxLines</span><span style="color:#ADBAC7;">=</span><span style="color:#96D0FF;">"1"</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#6CB6FF;">android:ellipsize</span><span style="color:#ADBAC7;">=</span><span style="color:#96D0FF;">"end"</span><span style="color:#ADBAC7;"> /></span></span>
|
||
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div></div><h3 id="personalized-configuration" tabindex="-1"><a class="header-anchor" href="#personalized-configuration" aria-hidden="true">#</a> Personalized Configuration</h3><p><code>PanguText</code> supports personalized configuration. You can use the global static instance <code>PanguText.globalConfig</code> to get the global configuration or configure it individually.</p><blockquote><p>The following example</p></blockquote><div class="language-kotlin line-numbers-mode" data-ext="kt"><pre class="shiki github-dark-dimmed" style="background-color:#22272e;" tabindex="0"><code><span class="line"><span style="color:#768390;">// Get global configuration.</span></span>
|
||
<span class="line"><span style="color:#F47067;">val</span><span style="color:#ADBAC7;"> config </span><span style="color:#F47067;">=</span><span style="color:#ADBAC7;"> PanguText.globalConfig</span></span>
|
||
<span class="line"><span style="color:#768390;">// Enable or disable the feature.</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;">config.isEnabled </span><span style="color:#F47067;">=</span><span style="color:#ADBAC7;"> </span><span style="color:#6CB6FF;">true</span></span>
|
||
<span class="line"><span style="color:#768390;">// Process Spanned text.</span></span>
|
||
<span class="line"><span style="color:#768390;">// Processing Spanned text is enabled by default, but this feature is experimental.</span></span>
|
||
<span class="line"><span style="color:#768390;">// If issues occur, you can disable it. When disabled, Spanned text will return the original text.</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;">config.isProcessedSpanned </span><span style="color:#F47067;">=</span><span style="color:#ADBAC7;"> </span><span style="color:#6CB6FF;">true</span></span>
|
||
<span class="line"><span style="color:#768390;">// Whether to automatically re-measure the text width after processing.</span></span>
|
||
<span class="line"><span style="color:#768390;">// Note: After [PanguText] injects text and changes the text,</span></span>
|
||
<span class="line"><span style="color:#768390;">// the width of [TextView] will not be calculated automatically.</span></span>
|
||
<span class="line"><span style="color:#768390;">// At this time, this feature will call [TextView.setText] to re-execute the measurements,</span></span>
|
||
<span class="line"><span style="color:#768390;">// which can fix issues in some dynamic layouts (such as `RecyclerView`) where text width changes each time,</span></span>
|
||
<span class="line"><span style="color:#768390;">// but may cause performance issues. You can choose to disable this feature.</span></span>
|
||
<span class="line"><span style="color:#768390;">// To prevent unnecessary performance overhead,</span></span>
|
||
<span class="line"><span style="color:#768390;">// this feature only takes effect on [TextView] with `maxLines` set to 1 or `singleLine`.</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;">config.isAutoRemeasureText </span><span style="color:#F47067;">=</span><span style="color:#ADBAC7;"> </span><span style="color:#6CB6FF;">true</span></span>
|
||
<span class="line"><span style="color:#768390;">// Set patterns to exclude during formatting using regular expressions.</span></span>
|
||
<span class="line"><span style="color:#768390;">// For example, exclude all URLs.</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;">config.excludePatterns.</span><span style="color:#DCBDFB;">add</span><span style="color:#ADBAC7;">(</span><span style="color:#96D0FF;">"https?://</span><span style="color:#F47067;">\\</span><span style="color:#96D0FF;">S+"</span><span style="color:#ADBAC7;">.</span><span style="color:#DCBDFB;">toRegex</span><span style="color:#ADBAC7;">())</span></span>
|
||
<span class="line"><span style="color:#768390;">// For example, exclude emoji placeholders like "[doge]".</span></span>
|
||
<span class="line"><span style="color:#768390;">// If you use [ImageSpan] to display emoji images, you can choose to exclude these placeholders.</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;">config.excludePatterns.</span><span style="color:#DCBDFB;">add</span><span style="color:#ADBAC7;">(</span><span style="color:#96D0FF;">"</span><span style="color:#F47067;">\\</span><span style="color:#96D0FF;">[.*?]"</span><span style="color:#ADBAC7;">.</span><span style="color:#DCBDFB;">toRegex</span><span style="color:#ADBAC7;">())</span></span>
|
||
<span class="line"><span style="color:#768390;">// Set the spacing ratio for CJK characters.</span></span>
|
||
<span class="line"><span style="color:#768390;">// This determines the final layout effect.</span></span>
|
||
<span class="line"><span style="color:#768390;">// It is recommended to keep the default ratio and adjust it according to personal preference.</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;">config.cjkSpacingRatio </span><span style="color:#F47067;">=</span><span style="color:#ADBAC7;"> </span><span style="color:#6CB6FF;">7f</span></span>
|
||
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><div class="custom-container warning"><p class="custom-container-title">Notice</p><p>If you integrated using the <a href="#inject-to-layoutinflater">Inject to LayoutInflater</a> method, configure <code>PanguText.globalConfig</code> before executing <code>PanguTextFactory2.inject(...)</code>, otherwise the configuration will not take effect.</p></div><p>You can also pass the <code>config</code> parameter for personalized configuration when manually injecting or formatting text.</p><blockquote><p>The following example</p></blockquote><div class="language-kotlin line-numbers-mode" data-ext="kt"><pre class="shiki github-dark-dimmed" style="background-color:#22272e;" tabindex="0"><code><span class="line"><span style="color:#768390;">// Assume this is your TextView.</span></span>
|
||
<span class="line"><span style="color:#F47067;">val</span><span style="color:#ADBAC7;"> textView: </span><span style="color:#F69D50;">TextView</span></span>
|
||
<span class="line"><span style="color:#768390;">// Create a new configuration.</span></span>
|
||
<span class="line"><span style="color:#768390;">// You can set [copyFromGlobal] to false to not copy from the global configuration.</span></span>
|
||
<span class="line"><span style="color:#F47067;">val</span><span style="color:#ADBAC7;"> config </span><span style="color:#F47067;">=</span><span style="color:#ADBAC7;"> </span><span style="color:#DCBDFB;">PanguTextConfig</span><span style="color:#ADBAC7;">(copyFromGlobal </span><span style="color:#F47067;">=</span><span style="color:#ADBAC7;"> </span><span style="color:#6CB6FF;">false</span><span style="color:#ADBAC7;">) {</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> excludePatterns.</span><span style="color:#DCBDFB;">add</span><span style="color:#ADBAC7;">(</span><span style="color:#96D0FF;">"https?://</span><span style="color:#F47067;">\\</span><span style="color:#96D0FF;">S+"</span><span style="color:#ADBAC7;">.</span><span style="color:#DCBDFB;">toRegex</span><span style="color:#ADBAC7;">())</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> excludePatterns.</span><span style="color:#DCBDFB;">add</span><span style="color:#ADBAC7;">(</span><span style="color:#96D0FF;">"</span><span style="color:#F47067;">\\</span><span style="color:#96D0FF;">[.*?]"</span><span style="color:#ADBAC7;">.</span><span style="color:#DCBDFB;">toRegex</span><span style="color:#ADBAC7;">())</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> cjkSpacingRatio </span><span style="color:#F47067;">=</span><span style="color:#ADBAC7;"> </span><span style="color:#6CB6FF;">7f</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;">}</span></span>
|
||
<span class="line"><span style="color:#768390;">// You can also copy and create a new configuration from any configuration.</span></span>
|
||
<span class="line"><span style="color:#F47067;">val</span><span style="color:#ADBAC7;"> config2 </span><span style="color:#F47067;">=</span><span style="color:#ADBAC7;"> config.</span><span style="color:#DCBDFB;">copy</span><span style="color:#ADBAC7;"> {</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> excludePatterns.</span><span style="color:#DCBDFB;">clear</span><span style="color:#ADBAC7;">()</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> excludePatterns.</span><span style="color:#DCBDFB;">add</span><span style="color:#ADBAC7;">(</span><span style="color:#96D0FF;">"https?://</span><span style="color:#F47067;">\\</span><span style="color:#96D0FF;">S+"</span><span style="color:#ADBAC7;">.</span><span style="color:#DCBDFB;">toRegex</span><span style="color:#ADBAC7;">())</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> excludePatterns.</span><span style="color:#DCBDFB;">add</span><span style="color:#ADBAC7;">(</span><span style="color:#96D0FF;">"</span><span style="color:#F47067;">\\</span><span style="color:#96D0FF;">[.*?]"</span><span style="color:#ADBAC7;">.</span><span style="color:#DCBDFB;">toRegex</span><span style="color:#ADBAC7;">())</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> cjkSpacingRatio </span><span style="color:#F47067;">=</span><span style="color:#ADBAC7;"> </span><span style="color:#6CB6FF;">7f</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;">}</span></span>
|
||
<span class="line"><span style="color:#768390;">// Manually inject and configure.</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;">textView.</span><span style="color:#DCBDFB;">injectPanguText</span><span style="color:#ADBAC7;">(config </span><span style="color:#F47067;">=</span><span style="color:#ADBAC7;"> config2)</span></span>
|
||
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>If you integrated using the <a href="#inject-to-layoutinflater">Inject to LayoutInflater</a> method, you can use the following attributes in the XML layout declaration of <code>TextView</code>, <code>EditText</code>, or their subclasses for personalized configuration.</p><ul><li><code>panguText_enabled</code> corresponds to <code>PanguTextConfig.isEnabled</code></li><li><code>panguText_processedSpanned</code> corresponds to <code>PanguTextConfig.isProcessedSpanned</code></li><li><code>panguText_autoRemeasureText</code> corresponds to <code>PanguTextConfig.isAutoRemeasureText</code></li><li><code>panguText_excludePatterns</code> corresponds to <code>PanguTextConfig.excludePatterns</code>, string array, multiple patterns separated by <code>|@|</code></li><li><code>panguText_cjkSpacingRatio</code> corresponds to <code>PanguTextConfig.cjkSpacingRatio</code></li></ul><blockquote><p>The following example</p></blockquote><div class="language-xml line-numbers-mode" data-ext="xml"><pre class="shiki github-dark-dimmed" style="background-color:#22272e;" tabindex="0"><code><span class="line"><span style="color:#ADBAC7;"><</span><span style="color:#8DDB8C;">TextView</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#6CB6FF;">android:id</span><span style="color:#ADBAC7;">=</span><span style="color:#96D0FF;">"@+id/text"</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#6CB6FF;">android:layout_width</span><span style="color:#ADBAC7;">=</span><span style="color:#96D0FF;">"wrap_content"</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#6CB6FF;">android:layout_height</span><span style="color:#ADBAC7;">=</span><span style="color:#96D0FF;">"wrap_content"</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#6CB6FF;">android:text</span><span style="color:#ADBAC7;">=</span><span style="color:#96D0FF;">"Xiaoming今年16岁"</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#6CB6FF;">app:panguText_enabled</span><span style="color:#ADBAC7;">=</span><span style="color:#96D0FF;">"true"</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#6CB6FF;">app:panguText_processedSpanned</span><span style="color:#ADBAC7;">=</span><span style="color:#96D0FF;">"true"</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#6CB6FF;">app:panguText_autoRemeasureText</span><span style="color:#ADBAC7;">=</span><span style="color:#96D0FF;">"true"</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#6CB6FF;">app:panguText_excludePatterns</span><span style="color:#ADBAC7;">=</span><span style="color:#96D0FF;">"https?://\\S+;\\[.*?]|@|\\[.*?]"</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#6CB6FF;">app:panguText_cjkSpacingRatio</span><span style="color:#ADBAC7;">=</span><span style="color:#96D0FF;">"7.0"</span><span style="color:#ADBAC7;"> /></span></span>
|
||
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><div class="custom-container warning"><p class="custom-container-title">Notice</p><p>Due to issues with Android Studio, the above attributes may not have auto-completion hints. Please complete them manually.</p><p>Don't forget to add the declaration <code>xmlns:app="http://schemas.android.com/apk/res-auto"</code>.</p></div><p>In custom <code>View</code>, you can extend your <code>View</code> to implement the <code>PanguTextView</code> interface to achieve the same functionality. This feature is also effective for the <a href="#using-the-patching-tool">Using the Patching Tool</a> method.</p><blockquote><p>The following example</p></blockquote><div class="language-kotlin line-numbers-mode" data-ext="kt"><pre class="shiki github-dark-dimmed" style="background-color:#22272e;" tabindex="0"><code><span class="line"><span style="color:#F47067;">class</span><span style="color:#ADBAC7;"> </span><span style="color:#F69D50;">MyTextView</span><span style="color:#ADBAC7;">(context: </span><span style="color:#F69D50;">Context</span><span style="color:#ADBAC7;">, attrs: </span><span style="color:#F69D50;">AttributeSet</span><span style="color:#ADBAC7;">? </span><span style="color:#F47067;">=</span><span style="color:#ADBAC7;"> </span><span style="color:#6CB6FF;">null</span><span style="color:#ADBAC7;">) : </span><span style="color:#F69D50;">AppCompatTextView</span><span style="color:#ADBAC7;">(</span><span style="color:#F69D50;">context</span><span style="color:#ADBAC7;">, </span><span style="color:#F69D50;">attrs</span><span style="color:#ADBAC7;">),</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#DCBDFB;">PanguTextView</span><span style="color:#ADBAC7;"> {</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#F47067;">override</span><span style="color:#ADBAC7;"> </span><span style="color:#F47067;">fun</span><span style="color:#ADBAC7;"> </span><span style="color:#DCBDFB;">configurePanguText</span><span style="color:#ADBAC7;">(config: </span><span style="color:#F69D50;">PanguTextConfig</span><span style="color:#ADBAC7;">) {</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#768390;">// Configure your [PanguTextConfig].</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;"> }</span></span>
|
||
<span class="line"><span style="color:#ADBAC7;">}</span></span>
|
||
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><div class="custom-container warning"><p class="custom-container-title">Notice</p><p>The <code>PanguTextView</code> interface takes precedence over attributes used directly in the XML layout. If you use both methods for configuration, the <code>PanguTextView</code> interface configuration will override the XML layout configuration.</p><p>Individual configurations will override global configurations, and options not configured will follow the global configuration.</p></div></div><!--[--><!--]--></div><footer class="page-meta"><div class="meta-item edit-link"><a class="external-link meta-item-label" href="https://github.com/BetterAndroid/PanguText/edit/main/docs-source/src/en/library/android.md" rel="noopener noreferrer" target="_blank" aria-label="Edit this page on GitHub"><!--[--><!--]--> Edit this page on GitHub <span><svg class="external-link-icon" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path><polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg><span class="external-link-icon-sr-only">open in new window</span></span><!--[--><!--]--></a></div><div class="meta-item last-updated"><span class="meta-item-label">Last Updated: </span><!----></div><div class="meta-item contributors"><span class="meta-item-label">Contributors: </span><span class="meta-item-info"><!--[--><!--[--><span class="contributor" title="email: qzmmcn@163.com">fankesyooni</span><!----><!--]--><!--]--></span></div></footer><nav class="page-nav"><p class="inner"><!----><span class="next"><a href="/PanguText/en/library/compose.html" class="" aria-label="Jetpack Compose"><!--[--><!--]--> Jetpack Compose <!--[--><!--]--></a></span></p></nav><!--[--><!--]--></main><!--]--></div><!----><!--]--></div>
|
||
<script type="module" src="/PanguText/assets/app-6WmjFGj_.js" defer></script>
|
||
</body>
|
||
</html>
|