2017-08-04 48 views
1

Ich möchte meine EditText-Eingabe von meinem ersten Fragment in die Textansicht auf dem zweiten Fragment auf Knopfdruck übergeben. TextView zeigt jedoch einen "Null" -Wert an, wenn ein Tastenklick ausgelöst wird.Fragment zu Fragment EditText

Erster Teil:

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

    TextView tv = (TextView) v.findViewById(R.id.tvFragFirst); 
    tv.setText(getArguments().getString("msg")); 

    Button btn = (Button) v.findViewById(R.id.tryBtn); 
    btn.setOnClickListener(new View.OnClickListener() { 
           @Override 
           public void onClick(View v) { 
            EditText woo = (EditText)v.findViewById(R.id.editText); 
            MainActivity.myBundle.putString("Try", String.valueOf(woo)); 
            switch (v.getId()) { 
             case R.id.tryBtn: 
             SecondFragment home = new SecondFragment(); 
              FragmentTransaction ft = getFragmentManager().beginTransaction(); 
              ft.replace(R.id.first_frag, home); 
              ft.setTransition(FragmentTransaction.TRANSIT_ENTER_MASK); 
              ft.addToBackStack(null); 
              ft.commit(); 
              break; 
            } 
           } 
          } 
    ); 

    return v; 
} 

Zweiter Teil:

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

    TextView tv = (TextView) v.findViewById(R.id.tvFragSecond); 
    TextView tvTry = (TextView) v.findViewById(R.id.tvTry); 
    String myValue = (String) MainActivity.myBundle.get("Try"); 

    return v; 
} 

MainActivity:

public static Bundle myBundle = new Bundle(); 

Antwort

0

diesen Code Versuchen Sie,

erste Fragment

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

//  TextView tv = (TextView) v.findViewById(R.id.tvFragFirst); 
//  tv.setText(getArguments().getString("msg")); 


     final EditText woo = (EditText)v.findViewById(R.id.editText); 

     Button btn = (Button) v.findViewById(R.id.tryBtn); 
     btn.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       SecondFragment home = new SecondFragment(); 

       Bundle bundle = new Bundle(); 
       bundle.putString("Try", woo.getText().toString()); 
       home.setArguments(bundle); 

       FragmentTransaction ft = getFragmentManager().beginTransaction(); 
       ft.replace(R.id.first_frag, home); 
       ft.setTransition(FragmentTransaction.TRANSIT_ENTER_MASK); 
       ft.addToBackStack(null); 
       ft.commit(); 

      } 
     }); 

     return v; 
    } 

Zweiter Teil

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

    TextView tv = (TextView) v.findViewById(R.id.tvFragSecond); 
    TextView tvTry = (TextView) v.findViewById(R.id.tvTry); 

    Bundle arguments = getArguments(); 
    if (arguments != null) { 
     String myValue = arguments.getString("Try"); 
     tvTry.setText(myValue); 
    } 


    return v; 
} 

und diese Zeile in Ihrer MainActivity entfernen, ist es besser, nicht statisch Bündel verwenden.

public static Bundle myBundle = new Bundle(); 
+0

Vielen Dank. Das hat perfekt funktioniert. Wie wäre es, wenn ich beim Klick auf die Schaltfläche mehrere Werte hinzufügen würde? – randolfrojo11

+0

einfach in das Bundle, die erstellt wurden: bundle.putString ("secondTry", woo2.getText(). ToString()); und dann aus dem Argument bekommen: String myValue2 = arguments.getString ("secondTry"); –

0

Verwenden Bundle für das, zeigen Code unten;

Fragment fragment = new SecondFragment(); 
    FragmentManager fm =getSupportFragmentManager(); 
    FragmentTransaction ft = fm.beginTransaction(); 
    ft.replace(R.id.frame_layout, fragment); 
    ft.commit(); 

    Bundle bundle = new Bundle(); 
    bundle.putString("id", woo.getText().toString()); 
    fragment.setArguments(bundle); 

und nutzen Sie diesen Wert in SecondFragment wie unten Code;

Bundle bundle = this.getArguments(); 
     if (bundle != null) { 
     String id = bundle.getString("id"); 
     } 
tv.setText(id); 
1

was ist mit newInstance mit Parametern aufrufen?

SecondFragment.newInstance(/*your text*/) //when you open your fragment 

//in your Second Fragment 
public static SecondFragment newInstance(String data) { 
    SecondFragment sFragment = new SecondFragment(); 
    Bundle bundle = new Bundle(); 
    bundle.putString("data", data); 
    sFragment.setArguments(bundle); 
    return sFragment; 
    } 
+0

Sie haben vergessen, diese Zeile hinzuzufügen: bundle.putString ("Try", woo.getText(). ToString()); in deinem Code. –

+0

@HareshChelana rechts. danke =) –

+0

Es tut mir leid. Aber wo stelle ich SecondFragment.newInstance (/ * Ihren Text * /) und was in "Ihren Text" einfügen, auch welches Fragment setze ich das öffentliche statische SecondFragment newInstance (String data) { SecondFragment sFragment = new SecondFragment() ; Bündelbündel = neues Bündel(); bundle.putString ("Daten", Daten); sFragment.setArguments (Bündel); Rückgabe sFragment; } ? Es tut mir sehr leid. Ich bin neu in der Android-Entwicklung. – randolfrojo11

0

über Ihre Aussage:

Aber Textview zeigt "null" Wert, wenn der Knopf klicken ausgelöst.

Dies ist nicht der Weg, um einen Text von editText

EditText woo = (EditText)v.findViewById(R.id.editText); 
String.valueOf(woo) 

versuchen, diese zu bekommen:

woo.getText().toString() 

über Weitergabe von Informationen zwischen den Fragmenten I EventBus

Es verwende verwendet die Beobachtermuster:

Sie abonniert zu einem Ereignis:

@Subscribe(threadMode = ThreadMode.MAIN) 
public void onMessageEvent(MessageEvent event) {/* Do something */}; 

Sie buchen Ereignisse:

EventBus.getDefault().post(new MessageEvent()); 

, wenn man beide Fragmente zur gleichen Zeit arbeiten. In Anbetracht Ihrer Logik haben Sie nicht beide Fragmente. So würde ich das als nächstes tun:

Ihr Fragment soll wie Ihre Aktivität nennen:

mainActivity.onSentInputField(woo.getText().toString()); 

Und Ihre Aktivität wird zum Ändern des Fragments mit den richtigen Informationen verantwortlich. Auf diese Weise ist der Code besser organisiert und die Fragmente werden an einem einzigen Ort geändert.

+0

Haben Sie denken, dies der richtige Weg ist, Daten zwischen zwei Fragmenten übergeben? –

+0

@HareshChhelana Antwort aktualisiert –

Verwandte Themen