2016-05-19 6 views
1

Ich erstelle eine Anwendung, so dass, wenn Benutzer ein Wort eingibt und die Taste drückt, zeigt die TextView ein neues Wort basierend auf einigen Regeln. Wenn das Wort den Buchstaben "a" enthält, ändern Sie es mit ".-" (Morsecode).Ersetzen von Buchstaben im EditText basierend auf einigen Regeln

Beispiel: Eingangswort: "ABBA" output:. "- .... - ..." (a = ".-" b = "-...")

Ich habe erstellt eine Demo-App mit nur 2 Regeln für "a" und "b". Es funktioniert, wenn ich nur einen Buchstaben eingegeben habe, aber wenn ich mehr wie "ab" eingabe, verhält es sich nicht richtig.

Java-Datei:

public class MainActivity extends AppCompatActivity { 

EditText vpis; 
TextView rezultat; 
Button pretvori; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    vpis = (EditText) findViewById(R.id.tekst); 
    rezultat = (TextView) findViewById(R.id.rezultat); 
    pretvori = (Button) findViewById(R.id.gumb); 


    pretvori.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      String morse = vpis.getText().toString(); 
      for (int i=0; i<morse.length(); i++){ 
       if(morse.charAt(i) == 'a'){ 
        rezultat.setText(".-"); 
       }else if (morse.charAt(i) == 'b'){ 
        rezultat.setText("-..."); 
       } 
      } 
     } 
    }); 
} 
} 

Vielen Dank im Voraus.

+0

können Sie Regex für diese oder Zeichenfolge ersetzen Methode viel einfacher und Sie können es ohne for-Schleife tun –

Antwort

1

Sie haben eine fehlerhafte Logik - Sie überschreiben den Text immer, indem Sie jedes Mal setText() verwenden. Deshalb ist nur der letzte Wert in der TextView sichtbar. Sie müssen Ihr Ergebnis anhängen und am Ende der Schleife den Text auf TextView setzen. Tun Sie dies:

String morse = vpis.getText().toString(); 
String text = ""; 
     for (int i=0; i<morse.length(); i++){ 
      if(morse.charAt(i) == 'a'){ 
       text+=".-"; 
      }else if (morse.charAt(i) == 'b'){ 
       text+="-..."; 
      } 
    } 
rezultat.setText(text); 

Wenn Sie etwas bessere Leistung haben wollen, sollten Sie StringBuilderStringBuffer statt String verwenden, da Strings sind unveränderlich und Verkettung macht tatsächlich eine neue String jedes Mal. Mit einem String es so aussehen würde:

StringBuilder sb = new StringBuilder(); 

Statt text+= whatever, würden Sie sb.append(whatever) verwenden und schließlich rezultat.setText(sb.toString()); tun würde

0

dies durch Zeichenfolge ersetzen Verfahren wie das, was getan werden kann, ich kommentieren es ist der einfachste Weg und nicht mehr Ram-Nutzung. Hier ist der modifizierte Code von dem, was Sie haben

public class MainActivity extends AppCompatActivity { 

EditText vpis; 
TextView rezultat; 
Button pretvori; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    vpis = (EditText) findViewById(R.id.tekst); 
    rezultat = (TextView) findViewById(R.id.rezultat); 
    pretvori = (Button) findViewById(R.id.gumb); 


    pretvori.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      String morse = vpis.getText().toString(); 
      String newString = morse.replace("a",".-"); 
      newString = newString.replace("b","-..."); 
      rezultat.setText(newString); 
     } 
    }); 
} 
} 

Wenn Sie viele Muster haben, dann können Sie das Muster eine konstante Array und nur Schleife das Muster mit String ersetzen Methode machen.

Korrektur:

In Ihrem Beispiel der "abba" zurückkehren sollte. "- ...-....-" wie diese.

Verwandte Themen