2014-01-17 2 views
7

В моем приложении сначала у меня есть текстовое изображение для отображения текста. Затем я хочу оправдать текст, но в android его невозможно оправдать текст в textview. Чтобы оправдать текст, я получаю помощь от this link. Я следую за ответом, предоставленным @ Kondzio, но не работает. Я не знаю, что не так в моем коде.Обосновать текст в текстовом виде

код-

xml-

<LinearLayout 
     android:id="@+id/bText" 
     android:orientation="horizontal" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_weight="4" 
     android:gravity="center">    
</LinearLayout> 

В strings.xml-

<string name="benef"> 
     <![CDATA[ 
     <html> 
     <head></head> 
     <body style="text-align:justify;color:gray;background-color:black;"> 
     "1.some text\n 
      2.some text\n 
      ............. 
</body> 
</html> 
]]> 
</string> 

Я устанавливаю scrollbarenabled истина сделать вертикальную прокрутку на мой текст.

+0

Попробуйте этот класс https://github.com/bluejamesbond/TextJustify-Android – Hariharan

ответ

7

// преобразование всего содержания языка, чтобы оправдать использование тегов HTML.

String youtContentStr = String.valueOf(Html 
       .fromHtml("<![CDATA[<body style=\"text-align:justify;color:#222222; \">" 
          + getResources().getString(R.string.passthe_content) 
          + "</body>]]>")); 

    view.loadData(youtContentStr, "text/html", "utf-8"); 

EDIT: или изменить код с добавил обратный слэш

<body style=\"text-align:justify;color:gray;background-color:black;\"> 
+0

, где я должен добавить этот код? и какие изменения я должен внести в свой код выше? –

+0

@JohnR очень просто, что вы делаете в вышеуказанном коде. проверить мой отредактированный ответ –

+0

В этом я должен также создать стиль и цвета? –

0

Скопируйте следующий класс для вашего проекта и расширить ваш TextView от этого:

JustifiedTextView.java:

import android.annotation.SuppressLint; 
    import android.content.Context; 
    import android.graphics.Color; 
    import android.text.SpannableString; 
    import android.webkit.WebChromeClient; 
    import android.webkit.WebView; 


    public class JustifiedTextView extends WebView { 

     private String core = "<html><body style='text-align:justify;color:rgba(%s);font-size:%dpx;margin: 10px 10px 10px 10px;'>%s</body></html>"; 
    private String textColor = "0,0,0,255"; 
    private String text = ""; 
    private int textSize = 12; 
    private int backgroundColor = Color.TRANSPARENT; 

    public JustifiedTextView(Context context) { 
     super(context); 
     this.setWebChromeClient(new WebChromeClient() { 

     }); 

    } 

    public void setText(String s) { 
     this.text = s; 
     // this.setPadding(10, 10, 10, 10); 
     reloadData(); 
    } 

    @SuppressLint("NewApi") 
    private void reloadData() { 

     // loadData(...) has a bug showing utf-8 correctly. That's why we need 
     // to set it first. 
     this.getSettings().setDefaultTextEncodingName("utf-8"); 

     this.loadData(String.format(core, textColor, textSize, text), 
      "text/html", "utf-8"); 

     // set WebView's background color *after* data was loaded. 
     super.setBackgroundColor(backgroundColor); 
     // Hardware rendering breaks background color to work as expected. 
     // Need to use software renderer in that case. 
     if (android.os.Build.VERSION.SDK_INT >= 11) 
      this.setLayerType(WebView.LAYER_TYPE_SOFTWARE, null); 
    } 

    public void setTextColor(int hex) { 
     String h = Integer.toHexString(hex); 
     int a = Integer.parseInt(h.substring(0, 2), 16); 
     int r = Integer.parseInt(h.substring(2, 4), 16); 
     int g = Integer.parseInt(h.substring(4, 6), 16); 
     int b = Integer.parseInt(h.substring(6, 8), 16); 
     textColor = String.format("%d,%d,%d,%d", r, g, b, a); 
     reloadData(); 
    } 

    public void setBackgroundColor(int hex) { 
     backgroundColor = hex; 
     reloadData(); 
    } 

    public void setTextSize(int textSize) { 
     this.textSize = textSize; 
     reloadData(); 
    } 

} 

Вы можете использовать его как это:

JustifiedTextView myMsg = new JustifiedTextView(this); 
    myMsg.setText(msg); 

Если ваше текстовое представление находится в xml, отредактируйте его так:

<com.whatever.JustifiedTextView <!--path to the JustifiedTextView.java --> 
     android:id="@+id=t1"> 
    </JustifiedTextView> 

сделать это в коде:

JustifiedTextView myMsg = (JustifiedTextView)findViewById(R.id.t1); 
    myMsg.setText("text"); 
+0

А какой код я должен написать в XML? –

+0

см. Мой отредактированный ответ –

+0

приложение перестает работать, когда я пытаюсь выполнить код. –

1
public class Main extends Activity { 

WebView webView; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
setContentView(R.layout.main); 

webView = (WebView) findViewById(R.id.webview); 

String text = "<html><body>" 
+ "<p align=\"justify\">" 
+ getString(R.string.lorem_ipsum) 
+ "</p> " 
+ "</body></html>"; 

webView.loadData(text, "text/html", "utf-8"); 
} 
} 

main 


main.xml: 

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout 
xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent"> 
<WebView 
android:id="@+id/webview" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" /> 
</RelativeLayout> 
0

первый Создать новый класс JustifyTextView.java его выравнивание текста TextView в центре. Am прилагается полный код ниже

your pakagename; 
import android.content.Context; 
import android.graphics.Canvas; 
import android.text.Layout; 
import android.text.StaticLayout; 
import android.text.TextPaint; 
import android.util.AttributeSet; 
import android.widget.TextView; 


public class JustifyTextView extends TextView { 

private int mLineY; 
private int mViewWidth; 

public JustifyTextView(Context context, AttributeSet attrs) { 
    super(context, attrs); 
} 

@Override 
protected void onLayout(boolean changed, int left, int top, int right, int bottom) { 
    super.onLayout(changed, left, top, right, bottom); 
} 

@Override 
protected void onDraw(Canvas canvas) { 
    TextPaint paint = getPaint(); 
    paint.setColor(getCurrentTextColor()); 
    paint.drawableState = getDrawableState(); 
    mViewWidth = getMeasuredWidth(); 
    String text = (String) getText(); 
    mLineY = 0; 
    mLineY += getTextSize(); 
    Layout layout = getLayout(); 
    for (int i = 0; i < layout.getLineCount(); i++) { 
     int lineStart = layout.getLineStart(i); 
     int lineEnd = layout.getLineEnd(i); 
     String line = text.substring(lineStart, lineEnd); 

     float width = StaticLayout.getDesiredWidth(text, lineStart, lineEnd, getPaint()); 
     if (needScale(line)) { 
      drawScaledText(canvas, lineStart, line, width); 
     } else { 
      canvas.drawText(line, 0, mLineY, paint); 
     } 

     mLineY += getLineHeight(); 
    } 
} 

private void drawScaledText(Canvas canvas, int lineStart, String line, float lineWidth) { 
    float x = 0; 
    if (isFirstLineOfParagraph(lineStart, line)) { 
     String blanks = " "; 
     canvas.drawText(blanks, x, mLineY, getPaint()); 
     float bw = StaticLayout.getDesiredWidth(blanks, getPaint()); 
     x += bw; 

     line = line.substring(3); 
    } 

    float d = (mViewWidth - lineWidth)/line.length() - 1; 
    for (int i = 0; i < line.length(); i++) { 
     String c = String.valueOf(line.charAt(i)); 
     float cw = StaticLayout.getDesiredWidth(c, getPaint()); 
     canvas.drawText(c, x, mLineY, getPaint()); 
     x += cw + d; 
    } 
} 

private boolean isFirstLineOfParagraph(int lineStart, String line) { 
    return line.length() > 3 && line.charAt(0) == ' ' && line.charAt(1) == ' '; 
} 

private boolean needScale(String line) { 
    if (line.length() == 0) { 
     return false; 
    } else { 
     return line.charAt(line.length() - 1) != '\n'; 
    } 
} 

} 

Затем перейдите в код XML заменить TextView этим кодом

<your package.JustifyTextView 

     android:id="@+id/Textview" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content"   
     android:textAppearance="?android:attr/textAppearanceSmall"   
     android:lineSpacingMultiplier="1.1"   
     android:text="hai hello how" 
     /> 
6
import android.content.Context; 
import android.graphics.Canvas; 
import android.text.Layout; 
import android.text.StaticLayout; 
import android.text.TextPaint; 
import android.util.AttributeSet; 
import android.widget.TextView; 


public class JustifyTextView extends TextView { 

private int mLineY; 
private int mViewWidth; 

public JustifyTextView(Context context, AttributeSet attrs) { 
    super(context, attrs); 
} 

@Override 
protected void onLayout(boolean changed, int left, int top, int right, int bottom) { 
    super.onLayout(changed, left, top, right, bottom); 
} 

@Override 
protected void onDraw(Canvas canvas) { 
    TextPaint paint = getPaint(); 
    paint.setColor(getCurrentTextColor()); 
    paint.drawableState = getDrawableState(); 
    mViewWidth = getMeasuredWidth(); 
    String text = getText().toString(); 
    mLineY = 0; 
    mLineY += getTextSize(); 
    Layout layout = getLayout(); 
    for (int i = 0; i < layout.getLineCount(); i++) { 
     int lineStart = layout.getLineStart(i); 
     int lineEnd = layout.getLineEnd(i); 
     String line = text.substring(lineStart, lineEnd); 

     float width = StaticLayout.getDesiredWidth(text, lineStart, lineEnd, getPaint()); 
     if (needScale(line,i)) { 
      drawScaledText(canvas, lineStart, line, width); 
     } else { 
      canvas.drawText(line, 0, mLineY, paint); 
     } 

     mLineY += getLineHeight(); 
    } 
} 

private void drawScaledText(Canvas canvas, int lineStart, String line, float lineWidth) { 
    float x = 0; 
    if (isFirstLineOfParagraph(lineStart, line)) { 
     String blanks = " "; 
     canvas.drawText(blanks, x, mLineY, getPaint()); 
     float bw = StaticLayout.getDesiredWidth(blanks, getPaint()); 
     x += bw; 

     line = line.substring(3); 
    } 

    float d = (mViewWidth - lineWidth)/line.length() - 1; 
    for (int i = 0; i < line.length(); i++) { 
     String c = String.valueOf(line.charAt(i)); 
     float cw = StaticLayout.getDesiredWidth(c, getPaint()); 
     canvas.drawText(c, x, mLineY, getPaint()); 
     x += cw + d; 
    } 
} 

private boolean isFirstLineOfParagraph(int lineStart, String line) { 
    return line.length() > 3 && line.charAt(0) == ' ' && line.charAt(1) == ' '; 
} 

private boolean needScale(String line,int lineNumber) { 
    Layout layout = getLayout(); 
    if (line.length() == 0 || layout.getLineCount() == 1 || lineNumber == (layout.getLineCount() - 1)) { 
     return false; 
    } else { 
     return line.charAt(line.length() - 1) != '\n'; 
    } 
} 

} 

Я изменил код, данное Sasikumar исправить следующее.

  1. Если lineCount() равно 1, не оправдывайте. (Это было сделано)
  2. если lastLine, не оправдывайте его. (это выходит за рамки обоснования)

Это чисто текстовое решение. Html не работает. ни одна строка (\ n) или любой другой символ не работает. Все пробелы удаляются. Таким образом, это просто для ограниченного использования чистого текста.

+0

Спасибо, хорошо работает. – akki

5

использовать эту зависимость для justifytext библиотеки

compile 'com.uncopt:android.justified:1.0' 

и синхронизации Gradle

Для выравнивания текста в текстовом виде, использовать это в XML:

<com.uncopt.android.widget.text.justify.JustifiedTextView 
    android:layout_width="match_parent" 
    android:id="@+id/t1" 
    android:padding="5dp" 
    android:textColor="#303336" 
    android:textSize="18sp" 
    android:layout_height="wrap_content"/> 

и использовать это в классе Java:

JustifiedTextView myMsg = (JustifiedTextView)findViewById(R.id.t1); 
myMsg.setText("ur text data for justify"); 
+0

его медленно загружать большой текст –

+0

Очень медленно библиотека – ihojose

0

Как оправдать текст в Android без использования библиотеки See More code.

Создайте активность и вставьте следующий код See More

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    WebView webView= (WebView) findViewById(R.id.webView); 
    WebSettings webSettings=webView.getSettings(); 
    webSettings.setJavaScriptEnabled(true); 
    String htmlText = " %s "; 
    String myData = "<html><body style=\"text-align:justify\">The E-Learning Application is a Mobile based application. 
     The main objective of this application is to make it interactive 
    and its ease of use.The main features that the application provides are 
    online tutorial and tests, once the registered people select their 
    interested subjects. <br/> 
This helps to establish incremental learning process. Users can also 
discuss an issue/topic by posting messages in the discussion forum. 
      Along with this they can also take real time simulations of the most 
     widely known competitive exams.</body></Html>"; 

    webView.loadData(String.format(htmlText,myData),"text/html","utf-8"); 
} 
Смежные вопросы