Search code examples
androidtextview

how to get text from textview


if I have set text in textview in such way, which is not problem:

  tv.setText("" + ANS[i]);

this simply getting from this way.

     String a = tv.getText().toString();
     int A = Integer.parseInt(a);

But in case of setting value in textView.

 tv1.setText("  " + X[i] + "\n" + "+" + " " + Y[i]);

which is like this

              5
             +9

I have problem , this value how to get.


Solution

  • I haven't tested this - but it should give you a general idea of the direction you need to take.

    For this to work, I'm going to assume a few things about the text of the TextView:

    1. The TextView consists of lines delimited with "\n".
    2. The first line will not include an operator (+, -, * or /).
    3. After the first line there can be a variable number of lines in the TextView which will all include one operator and one number.
    4. An operator will allways be the first Char of a line.

    First we get the text:

    String input = tv1.getText().toString();
    

    Then we split it up for each line:

    String[] lines = input.split( "\n" );
    

    Now we need to calculate the total value:

    int total = Integer.parseInt( lines[0].trim() ); //We know this is a number.
    
    for( int i = 1; i < lines.length(); i++ ) {
       total = calculate( lines[i].trim(), total );
    }
    

    The method calculate should look like this, assuming that we know the first Char of a line is the operator:

    private int calculate( String input, int total ) {
       switch( input.charAt( 0 ) )
          case '+':
             return total + Integer.parseInt( input.substring( 1, input.length() );
          case '-':
             return total - Integer.parseInt( input.substring( 1, input.length() );             
          case '*':
             return total * Integer.parseInt( input.substring( 1, input.length() );             
          case '/':
             return total / Integer.parseInt( input.substring( 1, input.length() );
    }
    

    EDIT

    So the above as stated in the comment below does "left-to-right" calculation, ignoring the normal order ( + and / before + and -).

    The following does the calculation the right way:

    String input = tv1.getText().toString();
    input = input.replace( "\n", "" );
    input = input.replace( " ", "" );
    int total = getValue( input );
    

    The method getValue is a recursive method and it should look like this:

    private int getValue( String line ) {
      int value = 0;
    
      if( line.contains( "+" ) ) {
        String[] lines = line.split( "\\+" );
        value += getValue( lines[0] );
    
        for( int i = 1; i < lines.length; i++ )
          value += getValue( lines[i] );
    
        return value;
      }
    
      if( line.contains( "-" ) ) {
        String[] lines = line.split( "\\-" );
        value += getValue( lines[0] );
    
        for( int i = 1; i < lines.length; i++ )
          value -= getValue( lines[i] );
    
        return value;
      }
    
      if( line.contains( "*" ) ) {
        String[] lines = line.split( "\\*" );
        value += getValue( lines[0] );
    
        for( int i = 1; i < lines.length; i++ )
          value *= getValue( lines[i] );
    
        return value;
      }
    
      if( line.contains( "/" ) ) {
        String[] lines = line.split( "\\/" );
        value += getValue( lines[0] );
    
        for( int i = 1; i < lines.length; i++ )
          value /= getValue( lines[i] );
    
        return value;
      }
    
      return Integer.parseInt( line );
    }
    

    Special cases that the recursive method does not handle:

    • If the first number is negative e.g. -3+5*8.
    • Double operators e.g. 3*-6 or 5/-4.

    Also the fact the we're using Integers might give some "odd" results in some cases as e.g. 5/3 = 1.