TextWatcher soll „A“ durch „B“ ersetzen.

  • 23 Antworten
  • Letztes Antwortdatum
S

Sonderzeichen

Neues Mitglied
0
Hallo! Ich bin neu hier. :smile:

Folgendes: Ich habe einen TextWatcher programmiert, der in EditText jedesmal wenn „A“ auftaucht es durch „B“ ersetzen soll (nur als Beispiel).

Leider habe bei der Internet-Recherche nichts passendes gefunden.

Kann mir jemand sagen, wie man sowas konkret macht?

Besten Dank im Voraus.
 
du brauchst einen listener für den edittext, der immer aufgerufen wird wenn sich der text ändert.

in den listener schreibst du dann sowas in etwa rein:
edittext.settext(edittext.getText().replaceAll(A,B));
 
TUT MIR LEID! ( bin neu hier )
Das passt hier GAR NICHT. Aber ich weiß nicht wie ich einen neuen Thread eröffnen kann:sad:
Bitte helft mir! Danach kann dieser Beitrag gerne gelöscht werden.:smile:
 
Geballte Inkompetenz :D In jedem Sub-Forum ganz oben links "Neues Thema"
 
Danke Daniel!

Jetzt habe ich nur noch ein Problem: Der Code läuft, aber A bleibt A…?


final EditText editText1 = (EditText) findViewById(R.id.editText1);
final TextView done = (TextView)findViewById(R.id.myOutputBox);

editText1.addTextChangedListener(new TextWatcher() {

public void afterTextChanged(Editable s) {
String text = editText1.getText().toString();
text = text.replace('A', 'B');
done.setText(text);
 
Zuletzt bearbeitet:
Sonderzeichen schrieb:
Danke Daniel!

Jetzt habe ich nur noch ein Problem: Der Code läuft, aber A bleibt A…?

…
final EditText editText1 = (EditText) findViewById(R.id.editText1);
final TextView done = (TextView)findViewById(R.id.myOutputBox);

editText1.addTextChangedListener(new TextWatcher() {

public void afterTextChanged(Editable s) {
String text = editText1.getText().toString();
text = text.replace('A', 'B');
done.setText(text);
…


Also der Code stimmt eigentlich, hab das gerade auch selbst ausprobiert und es funktioniert. Du musst aber auf gross und kleinschreibung achten.

Der text im edittext soll ja so bleiben wie er ist und nur der im textview soll den bearbeiteten text anzeigen oder?
 
Daaaaniel schrieb:
Der text im edittext soll ja so bleiben wie er ist und nur der im textview soll den bearbeiteten text anzeigen oder?

Nein… ich möchte den Text in 'edittext' selbst verändern.
Wie mache ich das?
 
Ich habe mal was Anderes versucht, aber ohne Erfolg…


public class AndroidEditTextChangeActivity extends Activity implements TextWatcher {

EditText myText;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main); // activity_main?
myText = (EditText) findViewById(R.id.editText1);
myText.addTextChangedListener(this);

}
@Override
public void afterTextChanged(Editable s) {

Uni=s.toString();

Uni.replace('A', 'B');
 
Sonderzeichen schrieb:
Danke Daniel!

Jetzt habe ich nur noch ein Problem: Der Code läuft, aber A bleibt A…?

…
final EditText editText1 = (EditText) findViewById(R.id.editText1);
final TextView done = (TextView)findViewById(R.id.myOutputBox);

editText1.addTextChangedListener(new TextWatcher() {

public void afterTextChanged(Editable s) {
String text = editText1.getText().toString();
text = text.replace('A', 'B');
done.setText(text); <-- das ist dein TextView
…

Du änderst den Text im EditText doch nirgends.

Ersetzt das rote mal durch:
editText1.setText(text);

Ansonsten musst Du, wie bereits von Daaaniel erwähnt auf groß und kleinschreibung achten.
Kleine 'a' werden nicht ersetzt und da du afterTextChanged verwendest musst Du noch aus dem EditText rausklicken (bzw. ein anderes Element muss den Fokus haben), damit die Änderung wirkt.
 
reallord schrieb:
Du änderst den Text im EditText doch nirgends.

Ersetzt das rote mal durch:
editText1.setText(text);

Ansonsten musst Du, wie bereits von Daaaniel erwähnt auf groß und kleinschreibung achten.
Kleine 'a' werden nicht ersetzt und da du afterTextChanged verwendest musst Du noch aus dem EditText rausklicken (bzw. ein anderes Element muss den Fokus haben), damit die Änderung wirkt.

Aha… und was muss ich machen, damit das Ersetzen UNMITTELBAR wirksam wird (ohne rausklicken)?
 
Dafür brauchst Du dann onTextChanged, statt afterTextChanged.
 
Hatte ich schon ausprobiert; funktioniert nicht…?

public class AndroidEditTextChangeActivity extends Activity {

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

final EditText editText1 = (EditText) findViewById(R.id.editText1);

editText1.addTextChangedListener(new TextWatcher() {

public void afterTextChanged(Editable s) {

}

public void beforeTextChanged(CharSequence s, int start,
int count, int after) {

}

public void onTextChanged(CharSequence s, int start,
int before, int count) {
String text = editText1.getText().toString();
text = text.replace('a', 'b');
editText1.setText(text);
} });

}
 
Das hier funktioniert bei mir:

Code:
        editText1.addTextChangedListener(new TextWatcher() {

            public void onTextChanged(CharSequence s, int start, int before, int count) {

                // remove text changed listener to avoid recursion loop
                editText1.removeTextChangedListener(this);
                // replace characters
                s = s.toString().replace('a', 'b');
                // set new string to edit text
                editText1.setText(s);
                // place cursor at the end
                editText1.setSelection(editText1.getText().length());
                // re-add text changed listener
                editText1.addTextChangedListener(this);
            }

            @Override
            public void afterTextChanged(Editable s) {
                // TODO Auto-generated method stub

            }

            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
                // TODO Auto-generated method stub

            }
        });
Anscheinend kann man nicht einfach in onTextChanged den Text ersetzen, da ja dann wieder onTextChanged aufgerufen wird --> Infinite loop.

Schön ist das so nicht, funktioniert aber halt. Musst mal schon, ob dir das so hilft.
 
Klappt auch nicht :(
Ich poste mal den gesamten Code, vielleicht ist mir irgendwo anders ein Fehler unterlaufen:

package com.example.test;
import com.example.test.R;
import android.support.v7.app.ActionBarActivity;
import android.support.v4.app.Fragment;
import android.app.Activity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.text.Editable;
import android.text.TextWatcher;
import android.widget.EditText;

public class MainActivity extends ActionBarActivity {

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

if (savedInstanceState == null) {
getSupportFragmentManager().beginTransaction()
.add(R.id.container, new PlaceholderFragment()).commit();
}
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {

// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}

/**
* A placeholder fragment containing a simple view.
*/
public static class PlaceholderFragment extends Fragment {

public PlaceholderFragment() {
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_main, container,
false);
return rootView;
}
}

public class AndroidEditTextChangeActivity extends Activity {

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

final EditText editText1 = (EditText) findViewById(R.id.editText1);

editText1.addTextChangedListener(new TextWatcher() {

public void afterTextChanged(Editable s) {
}
public void beforeTextChanged(CharSequence s, int start,
int count, int after) {
}
public void onTextChanged(CharSequence s, int start, int before, int count) {

// remove text changed listener to avoid recursion loop
editText1.removeTextChangedListener(this);
// replace characters
s = s.toString().replace('a', 'b');
// set new string to edit text
editText1.setText(s);
// place cursor at the end
editText1.setSelection(editText1.getText().length());
// re-add text changed listener
editText1.addTextChangedListener(this);
}
});
}
}}
 
Anscheinend steh ich grad völlig auf dem Schlauch, warum hast Du denn zwei Activities.
Bzw. seh ich nicht, wie Du von einer Activity zur nächsten kommst.

Was steht denn in deiner AndroidManifest.xml?


Ansonsten hier mal mein kompletter Testcode:

MainActivity.java
Code:
package com.example.textwatcher;

import android.os.Bundle;
import android.app.Activity;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.Menu;
import android.widget.EditText;

public class MainActivity extends Activity {

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

        final EditText editText1 = (EditText) findViewById(R.id.editText1);

        editText1.addTextChangedListener(new TextWatcher() {

            public void onTextChanged(CharSequence s, int start, int before, int count) {

                // remove text changed listener to avoid recursion loop
                editText1.removeTextChangedListener(this);
                // replace characters
                s = s.toString().replace('a', 'b');
                // set new string to edit text
                editText1.setText(s);
                // place cursor at the end
                editText1.setSelection(editText1.getText().length());
                // re-add text changed listener
                editText1.addTextChangedListener(this);
            }

            @Override
            public void afterTextChanged(Editable s) {
                // TODO Auto-generated method stub

            }

            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
                // TODO Auto-generated method stub

            }
        });

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

}
activity_main.xml
Code:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" />

    <EditText
        android:id="@+id/editText1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/textView1"
        android:layout_below="@+id/textView1"
        android:ems="10" >

        <requestFocus />
    </EditText>

</RelativeLayout>
 
Ich benutze den SDK…

Code:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.test"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="19" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.example.test.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

Irgendwas aufschlussreiches :confused2:?
 
Spontan würd ich sagen deine AndroidEditTextChangeActivity wird nie aufgerufen/gestartet.

Ersetz mal in der Manifest:

android:name="com.example.test.MainActivity"

durch

android:name="com.example.test.AndroidEditTextChangeActivity" (ohne Leerzeichen natürlich, hier spinnt anscheinend das Forum)


Aber ich seh wirklich nicht warum Du überhaupt 2 Activities hast...
Imo brauchst Du AndroidEditTextChangeActivity gar nich...

Dein Code (mit deiner jetztigen Manifest) müsste eher so aussehen:
Code:
package com.example.test;
import com.example.test.R;
import android.support.v7.app.ActionBarActivity;
import android.support.v4.app.Fragment;
import android.app.Activity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.text.Editable;
import android.text.TextWatcher;
import android.widget.EditText;
 
public class MainActivity extends ActionBarActivity {
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.main);
 
      final EditText editText1 = (EditText) findViewById(R.id.editText1);
 
      editText1.addTextChangedListener(new TextWatcher() {
 
       public void afterTextChanged(Editable s) {
       }
       public void beforeTextChanged(CharSequence s, int start,
         int count, int after) {
       }
       public void onTextChanged(CharSequence s, int start, int before, int count) {
 
           // remove text changed listener to avoid recursion loop
           editText1.removeTextChangedListener(this);
           // replace characters
           s = s.toString().replace('a', 'b');
           // set new string to edit text
           editText1.setText(s);
           // place cursor at the end
           editText1.setSelection(editText1.getText().length(  ));
           // re-add text changed listener
           editText1.addTextChangedListener(this);
       }
    });
 
        if (savedInstanceState == null) {
            getSupportFragmentManager().beginTransaction()
                    .add(R.id.container, new PlaceholderFragment()).commit();
        }
    }
 
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
 
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
 
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
 
    /**
     * A placeholder fragment containing a simple view.
     */
    public static class PlaceholderFragment extends Fragment {
 
        public PlaceholderFragment() {
        }
 
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
            View rootView = inflater.inflate(R.layout.fragment_main, container,
                    false);
            return rootView;
        }
    }
}

Möglich, dass hier ein paar Klammern fehlen, hab das jetzt nich testen können.
 
Code:
[quote="reallord, post: 7561539"]
Ersetz mal in dem Manifest:

android:name="com.example.test.MainActivity"

durch

android:name="com.example.test.AndroidEditTextChangeActivity"
Stürzt ab.
 
Mhh, und mein Codebeispielt läuft auch nicht?

Ansonsten bin ich auch mit meinem Latein am Ende, sorry. :sad:
 
Stürzt auch ab. Trotzdem danke.

Ich hoffe immer noch, dass wir ganz nahe dran sind…
 
Zurück
Oben Unten