TextWatcher (1x Activity, 4x Fragment)

1

12nico07

Neues Mitglied
0
Hi,
ich bin grad dabei meine erste App zu entwickeln.
Ich habe eine Activity und 4 Fragmente. Durch "wischen" auf dem Bildschirm kann man durch die Fragments navigieren.
Auf Fragment 2 gibt es 2 Textfelder.
Nun will ich das mit jeder Änderung in einem der Textfelder die gleiche Methode aufgerufen wird. Nach einigen Stunden ausprobieren und Tutorials gucken bin ich nicht weiter. In den Tuts gibts mist nur eine Activity und nur eine Java Classe...
Kann mir jemand helfen wo und wie ich den TextWatcher implementieren kann? Bisher ist die App immer beim Starten abgestürtzt...

Ich habe den Textviewer schon in der PagerAdapter.java versucht zu steuern, in der MainActivity.java und in der setup_two.java. Aber scheinbar war das nie so ganz richtig.

Der Fehlöer liegt vermutlich in der setup_two.java Wenn ich das
Code:
EditText myText = ....
auskommentiere kommt kein Fehler. Ich habe darauf hin einige Versuche gestartete die Zeile richtig zu schreiben aber ging nicht.

MainActivity.java
Code:
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.support.v4.view.ViewPager;

public class MainActivity extends FragmentActivity  {

    ViewPager vpager;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        vpager = (ViewPager) findViewById(R.id.vpager);
        PagerAdapter padapter = new PagerAdapter(getSupportFragmentManager());
        vpager.setAdapter(padapter);
    }

}


PagerAdapter.java
Code:
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;

/**
 * Created by Nico on 05.02.2015.
 */

public class PagerAdapter  extends FragmentPagerAdapter{

    public PagerAdapter (FragmentManager fm) {
        super (fm);
    }

    @Override
    public Fragment getItem (int arg0) {

        switch (arg0) {
            case 0:
                return new setup_one();
            case 1:
                return new setup_two();
            case 2:
               return new setup_three();
            case 3:
                return new setup_four();
            default:
                break;
        }


        return null;
    }


    @Override
    public int getCount() {
        return 4;
    }


}

setup_two.java (Das zweite Fragment. Hier sind die zwei EditText Felder drauf)
Code:
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

/**
 * Created by Nico on 05.02.2015.
 */
public class setup_two extends Fragment /* implements TextWatcher */   {

    /*
        EditText myText = (EditText) getActivity().findViewById(R.id.txt_pw);

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

        }

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

        }

        @Override
        public void afterTextChanged(Editable s) {

        }

*/

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
      //  passwort.addTextChangedListener(myWatcher);
      //  passwort2.addTextChangedListener(myWatcher);
      return inflater.inflate(R.layout.setup_two_layout, container ,false);
    }

}


setup_two_layout.xml
Code:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="16dp"
    android:background="#FFFFFF">

    <!-- Überschrift -->
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/lbl_setup_b_head"
        android:id="@+id/lbl_head"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:textSize="30sp"
        android:layout_marginBottom="4dp"
        android:textColor="#000000"/>

    <!-- Erstes Textelement -->
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:text="@string/lbl_setup_b_1"
        android:id="@+id/lbl_whyPW"
        android:layout_below="@+id/lbl_head"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="4dp"
        android:layout_marginBottom="20dp"
        android:textColor="#000000"/>

    <!-- Zweites Textelement -->
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:text="@string/lbl_setup_b_2"
        android:id="@+id/lbl_pwAnforderung"
        android:layout_below="@+id/lbl_whyPW"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="4dp"
        android:layout_marginBottom="20dp"
        android:textColor="#000000"/>


    <!-- Passwort Textelement -->
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:text="@string/lbl_setup_b_pw"
        android:id="@+id/lbl_pw"
        android:textColor="#000000"
        android:layout_below="@+id/lbl_pwAnforderung"
        android:layout_alignParentLeft="true"
        android:layout_marginTop="4dp"
        android:layout_marginBottom="20dp"
        android:layout_marginRight="10dp"
       />


    <!-- Passworteingabefeld 1    -->
    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:inputType="textPassword"
        android:ems="10"
        android:id="@+id/txt_pw"
        android:text="@string/default_pw"
        android:textColor="#000000"
        android:shadowColor="#000000"
        android:layout_below="@+id/lbl_pwAnforderung"
        android:layout_alignParentRight="true"
        android:layout_toRightOf="@+id/lbl_pw"
        android:layout_toEndOf="@+id/lbl_pw"
        />


    <!-- Passwort wiederholen Textelement -->
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:text="@string/lbl_setup_b_pw2"
        android:id="@+id/lbl_pw2"
        android:textColor="#000000"
        android:layout_below="@+id/lbl_pw"
        android:layout_alignParentLeft="true"
        android:layout_marginTop="4dp"
        android:layout_marginBottom="20dp"
        android:layout_marginRight="10dp"
        />


    <!-- Passworteingabefeld 2    -->
    <EditText
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:inputType="textPassword"
        android:ems="10"
        android:id="@+id/txt_pw2"
        android:text="@string/default_pw"
        android:textColor="#000000"
        android:shadowColor="#000000"
        android:layout_below="@+id/lbl_pw"
        android:layout_alignParentRight="true"
        android:layout_alignLeft="@+id/txt_pw"
        android:layout_alignStart="@+id/txt_pw"
        />






    <!-- Unterstes Textelement (Hinweis zum wischen)-->
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:text="@string/lbl_swipe2goOn"
        android:id="@+id/lbl_swipe2goOn"
        android:layout_above="@+id/imgView_Navi"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="20dp"
        android:layout_marginBottom="20dp"
        android:textColor="#000000" />


    <!-- Navigationsbild -->
    <ImageView
        android:layout_width="80dp"
        android:layout_height="20dp"
        android:id="@+id/imgView_Navi"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:src="@drawable/navi_2" />



</RelativeLayout>
 
EditText myText = (EditText) getActivity().findViewById(R.id.txt_pw);


Das hört sich nach ein NullPointerException an. Du muss die Zuweisung in der Methode onCreateView() aufrufen. Und zwar nach dem du die Methode inflate(...) aufrufst.

Ohne das RootView liefert die Methode findViewById nur null zurück. Und das gibt nur Ärger. Alle in der richtige Reihenfolge. Nicht den dritten Schritt vor den ersten machen.

Habe gerade auf der Seite von Google geschaut, denke mal, du hast dich daran orientiert. Dann wundert mich nichts, ist mal wieder kompakter als nötig. Schau mal da nach:

Multi-pane development in Android with Fragments - Tutorial

Vielleicht hilft dir das zu dem Thema Fragmente.
 
Ich entwickle mit Android Studio und irgendwie kommt mir der Debugmodus etwas komisch vor, anders als bei Visual Studio oder so... Naja egal...
Danke für den Link, werde ich mal durchlesen wenn ich etwas Zeit habe.

Ich habe es so gemacht wie du gesagt hast. Die Inflater() Methode aufrufen und ihren Wer in einem View Objekt speichern. Dann das mit den Textfeldern und dem TextWatcher und dann das View Objekt per return zurück schicken. Klappt wunderbar.

Anbei die verbesserte Datei (setup_two.java)
Code:
import android.graphics.Color;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.TextView;


/**
 * Created by Nico on 05.02.2015.
 */
public class setup_two extends Fragment  {



    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
      
        final View myview = inflater.inflate(R.layout.setup_two_layout, container ,false);

//Die zwei Felder um Text einzugeben 
        final EditText myText_A = (EditText) myview.findViewById(R.id.txt_pw);
        final EditText myText_B = (EditText) myview.findViewById(R.id.txt_pw2);

//TextWatcher Objekt erstellen und Methoden programmieren.
        TextWatcher myWatcher = new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {

/* Hier kann Code rein (haben ihn aufgrund der Übersichtlichkeit nicht gepostet) */

            }

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

/* Hier kann Code rein (haben ihn aufgrund der Übersichtlichkeit nicht gepostet) */

            }

            @Override
            public void afterTextChanged(Editable s) {

/* Hier kann Code rein (haben ihn aufgrund der Übersichtlichkeit nicht gepostet) */

            }
        };

// Den beiden Eingabefeldern noch den TextWatcher übergeben.
myText_A.addTextChangedListener(myWatcher);
        myText_B.addTextChangedListener(myWatcher);

      return myview;
    }

}
 
So stark unterscheiden sich die Debugger nicht. Die Fehlermeldungen unter Android (Java) sind normalerweise ausführlicher. Mit den anderen Tools des sdk ist man schon sehr gut aufgestellt.

Einfach mal ausprobieren. Logcat ist wohl das wichtigste Tool bei der Androidentwicklung.
 

Ähnliche Themen

M
Antworten
2
Aufrufe
853
jogimuc
J
M
  • maksimilian
Antworten
15
Aufrufe
1.651
maksimilian
M
M
Antworten
8
Aufrufe
945
deek
D
Zurück
Oben Unten