8

Utworzono dwa układy: w pionie o jednakowej szerokości. Mam dane łańcuchowe, które będą wyświetlane dynamicznie w widoku tekstowym. Gdy ciąg jest większy niż szerokość układu, ciąg jest zawijany do szerokości układu, a dla pozostałego łańcucha chcę dynamicznie tworzyć nowy telewizor. Ten proces kończy się, aż pozostałe wykończenia łańcucha. Dla następnego ciągu kontynuowany jest ten sam proces. Kiedy proces osiągnie dno Linelayout1, pozostały ciąg powinien zaczynać się od Linelayout2. Proces trwa, dopóki nie osiągnie dna Linelayout2.sposób wyświetlania ciągu znaków w zależności od szerokości układu

Starałem się ten

private void nextlinechar(int numChars,String devstr) { 
    nextchar=devstr; 
    Log.d("char 1",""+nextchar); 
    TextView sub=new TextView(getApplicationContext()); 
    sub.setLines(1); 
    sub.setTextColor(Color.BLACK); 
    sub.setTextSize(textsize); 
    sub.setText(nextchar); 
    nextchar=devstr.substring(nextcharstart); 
    String textToBeSplit = nextchar; // Text you want to split between TextViews 
    String data=TextMeasure(nextchar,sub); 
    float myTextSize=sub.getTextSize(); 
    float textView2Width=400; 

// String next=TextMeasure(nextchar,sub); 
    Paint paint = new Paint();  
    paint.setTextSize(myTextSize); // Your text size 
    numChars1= paint.breakText(textToBeSplit, true,textView2Width, null); 
    nextchar1=nextchar.substring(numChars1); 
// Log.d("char",""+i+" "+nextchar.length()); 
    main.addView(sub); 
    nextlinechar(numChars1,nextchar); 
} 

Ilustracja

enter image description here

+1

Pokaż nam kod, który wypróbowałeś do tej pory. – Piovezan

+0

@Piovezan Hej Proszę zobaczyć moje zredagowane pytanie –

+0

Jest to bardzo skomplikowane pytanie do zrozumienia, ściana tekstu. Zamiast tego możesz schematycznie zilustrować, czego potrzebujesz i co widzisz teraz? – Siddharth

Odpowiedz

0

reffer To może być to pomóc:

package com.example.demo; 

    import android.content.Context; 
    import android.graphics.Paint; 
    import android.util.AttributeSet; 
    import android.util.TypedValue; 
    import android.widget.TextView; 

    public class FontFitTextView extends TextView { 

     public FontFitTextView(Context context) { 
      super(context); 
      initialise(); 
     } 

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

     private void initialise() { 
      mTestPaint = new Paint(); 
      mTestPaint.set(this.getPaint()); 
      // max size defaults to the initially specified text size unless it is 
      // too small 
     } 

     /* 
     * Re size the font so the specified text fits in the text box assuming the 
     * text box is the specified width. 
     */ 
     private void refitText(String text, int textWidth) { 
      if (textWidth <= 0) 
       return; 
      int targetWidth = textWidth - this.getPaddingLeft() 
        - this.getPaddingRight(); 
      float hi = 100; 
      float lo = 2; 
      final float threshold = 0.5f; // How close we have to be 

      mTestPaint.set(this.getPaint()); 

      while ((hi - lo) > threshold) { 
       float size = (hi + lo)/2; 
       mTestPaint.setTextSize(size); 
       if (mTestPaint.measureText(text) >= targetWidth) 
        hi = size; // too big 
       else 
        lo = size; // too small 
      } 
      // Use lo so that we undershoot rather than overshoot 
      this.setTextSize(TypedValue.COMPLEX_UNIT_PX, lo); 
     } 

     @Override 
     protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
      super.onMeasure(widthMeasureSpec, heightMeasureSpec); 
      int parentWidth = MeasureSpec.getSize(widthMeasureSpec); 
      int height = getMeasuredHeight(); 
      refitText(this.getText().toString(), parentWidth); 
      this.setMeasuredDimension(parentWidth, height); 
     } 

     @Override 
     protected void onTextChanged(final CharSequence text, final int start, 
       final int before, final int after) { 
      refitText(text.toString(), this.getWidth()); 
     } 

     @Override 
     protected void onSizeChanged(int w, int h, int oldw, int oldh) { 
      if (w != oldw) { 
       refitText(this.getText().toString(), w); 
      } 
     } 

     // Attributes 
     private Paint mTestPaint; 
    } 
1

Możliwe rozwiązanie 1

Potrzebny jest FlowLayout, znaleziony here. Zasadniczo tekst musi się zawijać, zamiast przepełnienia w prawo.

Możliwe rozwiązanie 2

spróbuje użyć webview zamiast, i wypełnić tekst w 2 WebViews. To będzie szybsze przy mniejszym kodzie, a nie jako błędne.

Użyłem FlowLayout tylko wtedy, gdy potrzebowałem kliknąć każde słowo osobno. Zasadniczo test gramatyki, w którym ludzie wybierają części mowy zdania. Do tego potrzebowałem słuchacza każdego słowa.

+0

hej ja też chcę dodać obrazy w b/w tekstu, a następnie co zrobić? –

+0

Rozwiązanie 2 jest najlepsze, w ten sposób możesz dużo lepiej bawić się treścią. – Siddharth

0

Poniżej przedstawiono pomysł wpadłem (oczywiście po raz pierwszy starał się szukać wbudowanym metody TextViwe który robi co trzeba, ale nie mógł znaleźć dowolny):

  1. Określ, ile wierszy powinno być wyświetlanych w każdym z układów (lewy i prawy) w zależności od rozmiaru ekranu (this.getResources(). GetDefaultDisplay(), a następnie wyszukaj odpowiednią metodę), żądanego rozmiaru tekstu i spacji między układy i między tekstem a górną/dolną krawędzią. Nie zapominaj, że musisz przekonwertować piksele na spadki lub odwrotnie, ponieważ większość metod pomiaru rozmiaru Androida zwraca rozmiar w pikselach.

  2. Ustaw maksymalną liczbę linii dla każdego z telewizorów (tv.setLines()).

  3. Ustaw cały tekst na lewy telewizor.

  4. Teraz pierwsza połowa tekstu zostanie wyświetlona w lewym telewizorze. Druga część tekstu zostanie ukryta, ponieważ osiągnąłeś maksymalną liczbę linii w telewizorze. Tak więc, użyj getText(), aby odebrać tekst aktualnie wyświetlany w telewizorze (mam nadzieję, że zwróci to tylko pierwszą połowę tekstu .. jeszcze tego nie wypróbowałem, przepraszam, jeśli nie, może istnieje metoda getDisplayedText() lub coś). Teraz możesz użyć prostych metod Java, aby pobrać tylko reminingową część tekstu z oryginalnego tekstu (podłańcuch) i ustawić go na drugim telewizorze.

Nadzieję, że pomaga.

Powiązane problemy