2016-08-10 1 views
0

Ich habe einen ViewPager mit zwei Fragmenten. Was ich machen will; was ich vorhabe zu tun;Wie kann ich die Ansichten eines anderen Fragments in ViewPager ändern?

Ändern Sie das Bild eines ImageView und ändern Sie einige Eigenschaften eines TextView von einem anderen Fragment.

Ich habe versucht, dies zu tun:

Das in meinem SettingsFragment.java ist. Von diesem Fragment möchte ich einige Ansichten von CalculatorFragment ändern. Die OnActivityResult-Methode wird aufgerufen, wenn der Benutzer ein Bild aus der Galerie auswählt. Wenn diese Methode aufgerufen wird, speichere ich dieses Bild und rufe dann die Callback-Methode auf, damit MainActivity weiß, dass der Benutzer ein neues Bild aus der Galerie auswählt.

public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (resultCode == getActivity().RESULT_OK) { 
     if (requestCode == SELECT_PICTURE) { 

      try { 
       imageSaver.save(MediaStore.Images.Media.getBitmap(getActivity().getContentResolver(), data.getData())); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 

      settingsFragmentCallback.newMessage(NEW_PICTURE); 
     } 
    } 
} 

public interface SettingsFragmentCallback{ 
    void newMessage(String message); 
} 

@Override 
public void onAttach(Context context) { 
    super.onAttach(context); 
    try { 
     settingsFragmentCallback = (SettingsFragmentCallback) context; 
    } catch (ClassCastException e){ 

    } 
} 

Dies ist in meiner MainActivity. Hier empfange ich die Nachricht aus dem Einstellungsfragment und wenn ich sie erhalte, rufe ich die getMessage Methode des Rechners auf, so dass dieses Fragment weiß, dass der Benutzer ein Bild aus der Galerie auswählt.

public class MainActivity extends FragmentActivity implements 
            SettingsFragment.SettingsFragmentCallback { 

@Override 
public void newMessage(String message) { 
    CalculatorFragment cf = (CalculatorFragment) 
       getSupportFragmentManager().findFragmentById(R.id.fragmentCalculator); 
    cf.getMessage(message); 
} 

Dies ist in der Rechner-Fragment. Wenn der Benutzer ein neues Bild aus der Galerie ausgewählt hat, ruft er die Methode "setbackground" auf.

private void setBackground(){ 
    final Bitmap bitmap = imageSaver.load(); 

    if(bitmap != null){ 
     imageViewBackground.setImageBitmap(bitmap); 

    } 
} 

public void getMessage(String message){ 
    switch (message){ 
     case SettingsFragment.NEW_PICTURE: 
      setBackground(); 
      break; 
     default: 
      break; 
    } 
} 

ich gedebuggt dies und es funktioniert gut (es ist in der setBackground Methode kommt), aber aus irgendeinem Grunde ist die Image nicht aktualisiert. Das Bild selbst wird gespeichert und korrekt geladen, aber ImageView wird einfach nicht aktualisiert.

Vielen Dank für Ihre Hilfe!

+0

Können Sie bitte ein Code-Snippet? –

+0

Ich denke, dass der Rückruf funktionieren sollte, können Sie Ihren Code dort veröffentlichen, wo Sie den Rückruf verwenden? –

+0

Sie können LocalBroadcastManager verwenden Siehe Beispiel hier http://stackoverflow.com/questions/8802157/how-to-use-localbroadcastmanager –

Antwort

0

Da beide Fragmente in der gleichen Activity sind, fügen Sie eine Methode zu Activity Klasse und rufen Sie es von einem Fragment, wenn Sie etwas in dem anderen Fragment ändern möchten. Bevor Sie die Benutzeroberfläche aufrufen, vergewissern Sie sich, dass das Fragment, für das Sie Änderungen vornehmen möchten, der Aktivität "hinzugefügt" wird, indem Sie die Methode isAdded() aufrufen.

0

Angenommen, Sie haben zwei Fragmente FragmentA und Fragment B. Jetzt hat FragmentA einige ImageView und TextView und Sie möchten von FragmentB ändern. Angenommen, in ViewPager fragmenta an Position 0 und FragmentB an Position 1. Nun, wenn Sie möchten, Daten ändern sich wie folgt:

View view = yourViewPager.getChildAt(0); 
((ImageView) view.findViewById(R.id.idOfImageView)).setImageResource(yourResource); 
((TextView) view.findViewById(R.id.idOfTextView)).setText("Your Text"); 
+0

Hallo, ich habe es versucht, aber es funktioniert nicht für mich. Irgendeine Idee warum? – tomhogenkamp

+0

Es sollte funktionieren, wenn alle Fragmente und ViewPager korrekt implementiert sind. –

Verwandte Themen