Sorumu Google'da inceledim ancak çalışan bir yanıt sağlanmadı. Metin görünümüme nasıl madde işaretli liste eklerim?
Sorumu Google'da inceledim ancak çalışan bir yanıt sağlanmadı. Metin görünümüme nasıl madde işaretli liste eklerim?
Yanıtlar:
Ul / li / ol olarak yapılması zor desteklenmez. Neyse ki bunu sözdizimsel şeker olarak kullanabilirsiniz:
• foo<br/>
• bar<br/>
• baz<br/>
•
bir liste için html varlığıdır madde işareti daha fazla seçenek burada http://www.elizabethcastro.com/html/extras/entities.html
Mark Murphy (@CommonsWare) tarafından hangi etiketlerin desteklendiği hakkında daha fazla bilgi http://commonsware.com/blog/Android/2010/05/26/html-tags-supported-by-textview.html Bunu Html.fromHtml ile yükleyin
((TextView)findViewById(R.id.my_text_view)).setText(Html.fromHtml(myHtmlString));
<string name="string_name"><![CDATA[ • foo<br /> • bar... ]]></string>
browep, HTML üzerinden güzel yolu açıkladı. Html varlığıyla sağlanan çözüm faydalı olabilir. Ama sadece mermiyi içeriyor. Metniniz kaydırılırsa, girinti doğru olmayacaktır.
Bir web görünümünü yerleştiren başka çözümler buldum. Bu, bazıları için uygun olabilir, ancak bence bu biraz abartılı ... (Liste görünümü kullanmakla aynı şey.)
Nelson : D' nin yaratıcı yaklaşımını seviyorum , ancak bu size bir metin görünümüne sırasız bir liste ekleme imkanı vermiyor.
BulletSpan kullanan madde işaretli sırasız liste örneğim
CharSequence t1 = getText(R.string.xxx1);
SpannableString s1 = new SpannableString(t1);
s1.setSpan(new BulletSpan(15), 0, t1.length(), 0);
CharSequence t2 = getText(R.string.xxx2);
SpannableString s2 = new SpannableString(t2);
s2.setSpan(new BulletSpan(15), 0, t2.length(), 0);
textView.setText(TextUtils.concat(s1, s2));
Pozitif:
Olumsuz:
Bir alternatif buldum .. sadece bu madde işaretini kopyalayın "•" (bu bir metindir) ve metin görünümünüzün metnine yapıştırın, metin rengini değiştirerek madde işareti rengini ve ayrıca boyut, yükseklik genişliği gibi diğer tüm özellikleri değiştirebilirsiniz. .. :)
yazarken bu madde işaretini almak için kısayol kullanabilirsiniz
pencereler için
ALT + 7
Mac için
ALT + 8
Buradaki çeşitli cevaplardan esinlenerek, bunu kolay bir astar yapmak için bir Utility sınıfı oluşturdum . Bu, kaydırılmış metin için girintili madde işaretli bir liste oluşturacaktır. Dizeleri, dizgi kaynaklarını ve dizi dizisi kaynaklarını birleştirmek için yöntemler vardır.
Bir TextView'a iletebileceğiniz bir CharSequence yaratacaktır. Örneğin:
CharSequence bulletedList = BulletListUtil.makeBulletList("First line", "Second line", "Really long third line that will wrap and indent properly.");
textView.setText(bulletedList);
Umarım yardımcı olur. Zevk almak.
Not: Bu, metinle aynı renkte küçük bir daire olan sistem standart madde işaretini kullanır. Özel bir madde işareti istiyorsanız, BulletSpan'ın alt sınıfını oluşturmayı ve drawLeadingMargin()
istediğiniz madde işaretini çizmek için onu geçersiz kılmayı düşünün . Nasıl çalıştığına dair bir fikir edinmek için BulletSpan kaynağına bir göz atın .
public class BulletTextUtil {
/**
* Returns a CharSequence containing a bulleted and properly indented list.
*
* @param leadingMargin In pixels, the space between the left edge of the bullet and the left edge of the text.
* @param context
* @param stringArrayResId A resource id pointing to a string array. Each string will be a separate line/bullet-point.
* @return
*/
public static CharSequence makeBulletListFromStringArrayResource(int leadingMargin, Context context, int stringArrayResId) {
return makeBulletList(leadingMargin, context.getResources().getStringArray(stringArrayResId));
}
/**
* Returns a CharSequence containing a bulleted and properly indented list.
*
* @param leadingMargin In pixels, the space between the left edge of the bullet and the left edge of the text.
* @param context
* @param linesResIds An array of string resource ids. Each string will be a separate line/bullet-point.
* @return
*/
public static CharSequence makeBulletListFromStringResources(int leadingMargin, Context context, int... linesResIds) {
int len = linesResIds.length;
CharSequence[] cslines = new CharSequence[len];
for (int i = 0; i < len; i++) {
cslines[i] = context.getString(linesResIds[i]);
}
return makeBulletList(leadingMargin, cslines);
}
/**
* Returns a CharSequence containing a bulleted and properly indented list.
*
* @param leadingMargin In pixels, the space between the left edge of the bullet and the left edge of the text.
* @param lines An array of CharSequences. Each CharSequences will be a separate line/bullet-point.
* @return
*/
public static CharSequence makeBulletList(int leadingMargin, CharSequence... lines) {
SpannableStringBuilder sb = new SpannableStringBuilder();
for (int i = 0; i < lines.length; i++) {
CharSequence line = lines[i] + (i < lines.length-1 ? "\n" : "");
Spannable spannable = new SpannableString(line);
spannable.setSpan(new BulletSpan(leadingMargin), 0, spannable.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
sb.append(spannable);
}
return sb;
}
}
Bu açık ara en kolay olanıdır ..
<string name="bullet_ed_list">\n\u2022 He has been Chairman of CFL Manufacturers Committee of ELCOMA, the All India Association of Lighting Equipment Manufacturers.
\n\u2022 He has been the President of Federation of Industries of India (FII).</string>
Kullanıma hazır Kotlin uzantısı
fun List<String>.toBulletedList(): CharSequence {
return SpannableString(this.joinToString("\n")).apply {
this@toBulletedList.foldIndexed(0) { index, acc, span ->
val end = acc + span.length + if (index != this@toBulletedList.size - 1) 1 else 0
this.setSpan(BulletSpan(16), acc, end, 0)
end
}
}
}
Kullanım:
val bulletedList = listOf("One", "Two", "Three").toBulletedList()
label.text = bulletedList
Renkler ve boyut:
Madde işareti rengini veya boyutunu değiştirmek için BulletSpan yerine CustomBulletSpan kullanın
package com.fbs.archBase.ui.spans
import android.graphics.Canvas
import android.graphics.Color
import android.graphics.Paint
import android.text.Layout
import android.text.Spanned
import android.text.style.LeadingMarginSpan
import androidx.annotation.ColorInt
class CustomBulletSpan(
private val bulletRadius: Int = STANDARD_BULLET_RADIUS,
private val gapWidth: Int = STANDARD_GAP_WIDTH,
@ColorInt private val circleColor: Int = STANDARD_COLOR
) : LeadingMarginSpan {
private companion object {
val STANDARD_BULLET_RADIUS = Screen.dp(2)
val STANDARD_GAP_WIDTH = Screen.dp(8)
const val STANDARD_COLOR = Color.BLACK
}
private val circlePaint = Paint().apply {
color = circleColor
style = Paint.Style.FILL
isAntiAlias = true
}
override fun getLeadingMargin(first: Boolean): Int {
return 2 * bulletRadius + gapWidth
}
override fun drawLeadingMargin(
canvas: Canvas, paint: Paint, x: Int, dir: Int,
top: Int, baseline: Int, bottom: Int,
text: CharSequence, start: Int, end: Int,
first: Boolean,
layout: Layout?
) {
if ((text as Spanned).getSpanStart(this) == start) {
val yPosition = (top + bottom) / 2f
val xPosition = (x + dir * bulletRadius).toFloat()
canvas.drawCircle(xPosition, yPosition, bulletRadius.toFloat(), circlePaint)
}
}
}
Kullandığım bir seçenek, mermiyi bir stil kullanarak çekilebilir olarak ayarlamaktı.
<style name="Text.Bullet">
<item name="android:background">@drawable/bullet</item>
<item name="android:paddingLeft">10dp</item>
</style>
Kullanım:
<TextView android:id="@+id/tx_hdr"
android:text="Item 1" style="@style/Text.Bullet" />
android:drawableLeft=
Bileşik bir çekilebilir ile basit TextView kullanın. Örneğin
<TextView
android:text="Sample text"
android:drawableLeft="@drawable/bulletimage" >
</TextView>
İşte başka bir çözüm, tam olarak bir metin görünümüne bir liste eklemek değil, ancak sanırım hedef aynı. Yalnızca XML gerektiren TableLayout kullanıyor ve küçük sıralı veya sırasız listeler için gerçekten basit. Aşağıda bunun için kullandığım örnek kod Java'da bir satır kod değil.
Pozitif:
Olumsuz:
her liste öğesi ayrı bir dize kaynağı olarak depolanır
<TableRow
android:layout_width="wrap_content"
android:layout_height="wrap_content"
>
<TextView
style="@style/helpPagePointsStyle"
android:layout_weight="0.2"
android:text="1." />
<TextView
style="@style/helpPagePointsStyle"
android:layout_weight="3"
android:text="@string/help_points1" />
</TableRow>
<TableRow
android:layout_width="wrap_content"
android:layout_height="wrap_content"
>
<TextView
style="@style/helpPagePointsStyle"
android:layout_weight="0.2"
android:text="2." />
<TextView
style="@style/helpPagePointsStyle"
android:layout_weight="3"
android:text="@string/help_points2" />
</TableRow>
<TableRow
android:layout_width="wrap_content"
android:layout_height="wrap_content"
>
<TextView
style="@style/helpPagePointsStyle"
android:layout_weight="0.2"
android:text="3." />
<TextView
style="@style/helpPagePointsStyle"
android:layout_weight="3"
android:text="@string/help_points3" />
</TableRow>
</TableLayout>
ve stil:
<style name="helpPagePointsStyle">
<item name="android:layout_width">0dp</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:gravity">left</item>
</style>
Burada, bir başlık ve her öğenin önünde bir sekme bulunan madde işaretli bir liste bulunmaktadır.
public class BulletListBuilder {
private static final String SPACE = " ";
private static final String BULLET_SYMBOL = "•";
private static final String EOL = System.getProperty("line.separator");
private static final String TAB = "\t";
private BulletListBuilder() {
}
public static String getBulletList(String header, String []items) {
StringBuilder listBuilder = new StringBuilder();
if (header != null && !header.isEmpty()) {
listBuilder.append(header + EOL + EOL);
}
if (items != null && items.length != 0) {
for (String item : items) {
Spanned formattedItem = Html.fromHtml(BULLET_SYMBOL + SPACE + item);
listBuilder.append(TAB + formattedItem + EOL);
}
}
return listBuilder.toString();
}
}
Tamamen aşırıya kaçtı ve özel bir metin görünümü yaptı.
Bunu şu şekilde kullanın:
<com.blundell.BulletTextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="--bullet 1 --bullet two --bullet three --bullet four" />
ve kod:
package com.blundell;
import android.content.Context;
import android.text.Html;
import android.util.AttributeSet;
import android.widget.TextView;
public class BulletTextView extends TextView {
private static final String SPLITTER_CHAR = "--";
private static final String NEWLINE_CHAR = "<br/>";
private static final String HTML_BULLETPOINT = "•";
public BulletTextView(Context context, AttributeSet attrs) {
this(context, attrs, android.R.attr.textViewStyle);
}
public BulletTextView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
checkForBulletPointSplitter();
}
private void checkForBulletPointSplitter() {
String text = (String) getText();
if (text.contains(SPLITTER_CHAR)) {
injectBulletPoints(text);
}
}
private void injectBulletPoints(String text) {
String newLinedText = addNewLinesBetweenBullets(text);
String htmlBulletText = addBulletPoints(newLinedText);
setText(Html.fromHtml(htmlBulletText));
}
private String addNewLinesBetweenBullets(String text) {
String newLinedText = text.replace(SPLITTER_CHAR, NEWLINE_CHAR + SPLITTER_CHAR);
newLinedText = newLinedText.replaceFirst(NEWLINE_CHAR, "");
return newLinedText;
}
private String addBulletPoints(String newLinedText) {
return newLinedText.replace(SPLITTER_CHAR, HTML_BULLETPOINT);
}
}
•
başka bir sembol seçmeniz gerektiğini kullanır fsymbols.com/signs/bullet-point
Bunu en kolay yol olarak buluyorum, textView'ı xml dosyasında olduğu gibi bırakıp aşağıdaki java kodunu kullanıyorum. benim için gayet iyi çalıştı.
private static final String BULLET_SYMBOL = "•";
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_tutorial);
TextView tv = (TextView) findViewById(R.id.yourTextView);
tv.setText("To perform this exercise you will need the following: "
+ System.getProperty("line.separator")//this takes you to the next Line
+ System.getProperty("line.separator")
+ Html.fromHtml(BULLET_SYMBOL + " Bed")
+ System.getProperty("line.separator")
+ Html.fromHtml(BULLET_SYMBOL + " Pillow"));
}
Madde işaretli liste, <ul>
<li>
, dize kaynağındaki ve etiketleri .
SetText (Html.fromHtml (string)) KULLANMAYIN ayarlamak için ! Dizeyi normal olarak xml olarak veya setText ( string ) kullanarak ayarlayın .
Örneğin:
strings.xml dosyası
<string name="str1">
<ul>
<li><i>first</i> item</li>
<li>item 2</li>
</ul>
</string>
layout.xml dosyası
<TextView
android:text="@string/str1"
/>
Aşağıdaki sonucu verecektir:
Aşağıdaki etiketler şu şekilde desteklenir (doğrudan dize kaynağına yerleştirilir):
<ul>
\n<ul><li>a</li> \n<li>b</li> \n<li>c</li></ul>
İçin single line text
sadece drawables kullanabilirsiniz:
<TextView
android:id="@+id/txtData"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:drawableStart="@drawable/draw_bullet_list"
android:drawablePadding="@dimen/padding_8dp"
android:text="Hello"
android:textColor="@color/colorBlack" />
draw_bullet_list.xml :
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<solid android:color="@color/colorAccent" />
<size
android:width="12dp"
android:height="12dp" />
</shape>
Değişebilirsin shape
, size
, color
ihtiyacı dayalı.
Madde işaretli bir liste yapmak için sahip olduğunuz iki seçenek şunlardır:
1. Seçenek en kolayıdır.
Eksik HTML etiketlerini desteklemenin başka bir yolu, burada gösterildiği gibi, onları güzel bir şekilde değiştirmektir.
EditText yapısıyla madde işareti listesi oluşturmak istiyorsanız.
Bu referanslardan yararlandım
Bu mermileri kullanabilirsin
EditText edtNoteContent = findViewById(R.id.editText_description_note);
edtNoteContent.addTextChangedListener(new TextWatcher(){
@Override
public void afterTextChanged(Editable e) {
}
@Override
public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
}
@Override
public void onTextChanged(CharSequence text, int start, int lengthBefore, int lengthAfter)
{
if (lengthAfter > lengthBefore) {
if (text.toString().length() == 1) {
text = "◎ " + text;
edtNoteContent.setText(text);
edtNoteContent.setSelection(edtNoteContent.getText().length());
}
if (text.toString().endsWith("\n")) {
text = text.toString().replace("\n", "\n◎ ");
text = text.toString().replace("◎ ◎", "◎");
edtNoteContent.setText(text);
edtNoteContent.setSelection(edtNoteContent.getText().length());
}
}
}
});