【问题标题】:Does anybody know how to justify a textview content in a ANDROID layout?有人知道如何在 ANDROID 布局中证明 textview 内容的合理性吗?
【发布时间】:2011-04-03 04:26:42
【问题描述】:

我一直在使用 android:gravity 属性,但仍然无法让我的文本内容在 textview 中显示为正确。有人知道它是否支持吗?有办法吗?有人成功了吗?

【问题讨论】:

标签: android textview justify


【解决方案1】:

Android 似乎不支持完全对齐。 :(

您可以达到的最佳效果是左对齐或右对齐。

Android TextView Justify Text

【讨论】:

    【解决方案2】:

    您还可以设置 TextView 的宽度以包装其内容(“wrap_content”)并在其父布局中对齐 TextView。

    【讨论】:

      【解决方案3】:

      使用以下代码:

              public class TextJustify {
      
              final static String SYSTEM_NEWLINE = "\n";
              final static float COMPLEXITY = 5.12f; // Reducing this will increase
                                           // efficiency but will decrease
                                          // effectiveness
              final static Paint p = new Paint();
      
              /* @author Mathew Kurian */
      
         public static void run(final TextView tv, float origWidth, 
                int paddingLeft, int   paddingRight, int marginLeft, int marginRight) {
      
      
          origWidth-= paddingRight+marginRight+paddingLeft+marginLeft;
          String s = tv.getText().toString();
          p.setTypeface(tv.getTypeface());
          String[] splits = s.split(SYSTEM_NEWLINE);
          float width = origWidth - 5;
          for (int x = 0; x < splits.length; x++)
              if (p.measureText(splits[x]) > width) {
                  splits[x] = wrap(splits[x], width, p);
                  String[] microSplits = splits[x].split(SYSTEM_NEWLINE);
                  for (int y = 0; y < microSplits.length - 1; y++)
                      microSplits[y] = justify(removeLast(microSplits[y], " "),
                              width, p);
                  StringBuilder smb_internal = new StringBuilder();
                  for (int z = 0; z < microSplits.length; z++)
                      smb_internal.append(microSplits[z]
                              + ((z + 1 < microSplits.length) ? SYSTEM_NEWLINE
                                      : ""));
                  splits[x] = smb_internal.toString();
              }
          final StringBuilder smb = new StringBuilder();
          for (String cleaned : splits)
              smb.append(cleaned + SYSTEM_NEWLINE);
          tv.setGravity(Gravity.RIGHT);
          tv.setText(smb);
          }
      
         private static String wrap(String s, float width, Paint p) {
      
         String[] str = s.split("\\s"); // regex
          StringBuilder smb = new StringBuilder(); // save memory
          smb.append(SYSTEM_NEWLINE);
          for (int x = 0; x < str.length; x++) {
              float length = p.measureText(str[x]);
              String[] pieces = smb.toString().split(SYSTEM_NEWLINE);
              try {
                  if (p.measureText(pieces[pieces.length - 1]) + length > width)
                      smb.append(SYSTEM_NEWLINE);
              } catch (Exception e) {
              }
              smb.append(str[x] + " ");
          }
          return smb.toString().replaceFirst(SYSTEM_NEWLINE, "");
        }
      
      private static String removeLast(String s, String g) {
             if (s.contains(g)) {
                 int index = s.lastIndexOf(g);
                 int indexEnd = index + g.length();
                 if (index == 0)
                     return s.substring(1);
                else if (index == s.length() - 1)
                     return s.substring(0, index);
                else
                    return s.substring(0, index) + s.substring(indexEnd);
          }
          return s;
      }
      
      private static String justifyOperation(String s, float width, Paint p) {
          float holder = (float) (COMPLEXITY * Math.random());
          while (s.contains(Float.toString(holder)))
              holder = (float) (COMPLEXITY * Math.random());
              String holder_string = Float.toString(holder);
          float lessThan = width;
          int timeOut = 100;
          int current = 0;
          while (p.measureText(s) < lessThan && current < timeOut) {
              s = s.replaceFirst(" ([^" + holder_string + "])", " "
                      + holder_string + "$1");
                  lessThan = p.measureText(holder_string) + lessThan
                      - p.measureText(" ");
              current++;
          }
          String cleaned = s.replaceAll(holder_string, " ");
          return cleaned;
      }
      
      private static String justify(String s, float width, Paint p) {
          while (p.measureText(s) < width) {
              s = justifyOperation(s, width, p);
          }
      return s;
      }
        }
      

      为了调用这个我创建公式,您必须使用以下代码:

       public static final int FinallwidthDp  = 320 ;
       public static final int widthJustify  = 223 ;
      
       DisplayMetrics metrics = new DisplayMetrics();
       getWindowManager().getDefaultDisplay().getMetrics(metrics);
       int widthPixels = metrics.widthPixels;
      
       float scaleFactor = metrics.density;
       float widthDp = widthPixels / scaleFactor;
      
       TextView tv = (TextView) findViewById(R.id.textView1);
       ViewGroup.MarginLayoutParams lp1 = (ViewGroup.MarginLayoutParams) tv.getLayoutParams();
      
       tv.setText(text);
       TextJustify.run(tv,widthDp / FinallwidthDp * widthJustify , tv.getPaddingLeft(),tv.getPaddingRight() , lp1.leftMargin, lp1.rightMargin);
      

      此算法在各种设备上进行了测试,并且在正常活动(不是对话框)和TextViewwrap-content 宽度中运行良好,并且适用于每个填充和边距。如果对您不利,您可以更改 widthJustify 直到看起来不错,希望对你有用

      【讨论】:

        【解决方案4】:

        XML 布局:声明 WebView 而不是 TextView

        <WebView
         android:id="@+id/textContent"
         android:layout_width="fill_parent"
         android:layout_height="wrap_content" />
        

        Java代码:设置文本数据到WebView

        WebView view = (WebView) findViewById(R.id.textContent);
        String text;
        text = "<html><body><p align=\"justify\">";
        text+= "This is the text will be justified when displayed!!!";
        text+= "</p></body></html>";
        view.loadData(text, "text/html", "utf-8");
        

        这可能会解决您的问题。

        【讨论】:

          猜你喜欢
          • 2016-04-15
          • 1970-01-01
          • 2012-02-23
          • 2020-11-07
          • 1970-01-01
          • 2014-04-08
          • 1970-01-01
          • 2015-04-14
          • 1970-01-01
          相关资源
          最近更新 更多