2016-08-10 100 views
0

我有一個ViewPager與兩個片段。我想做的事;如何從ViewPager中的其他片段更改視圖?

更改ImageView的圖片並從另一個片段更改TextView的某些屬性。

我嘗試這樣做:

這是我SettingsFragment.java。從這個片段我想改變CalculatorFragment的一些視圖。 OnActivityResult方法在用戶從圖庫中選取圖片時調用。如果調用此方法,我正在保存此圖片,然後調用「回調方法」,以便MainActivity知道用戶從圖庫中選擇了一張新圖片。

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){ 

    } 
} 

這是在我的MainActivity中。在這裏,我收到來自Settings Fragment的消息,當我收到它時,我將調用Calculator Fragment getMessage方法,以便此Fragment知道用戶從庫中選擇了一張圖片。

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); 
} 

這是在Calculator Fragment中。如果用戶從圖庫中選取了一張新照片,則會調用setbackground方法。

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; 
    } 
} 

我調試了這個,它工作正常(它來自setBackground方法),但由於某種原因,ImageView沒有更新。圖像本身保存正確加載,但ImageView不會更新。

感謝您的幫助!

+0

能否請您提供一個代碼段? –

+0

我認爲回調應該起作用,你可以在你使用回調的地方發佈你的代碼嗎? –

+0

您可以使用LocalBroadcastManager請參閱示例這裏http://stackoverflow.com/questions/8802157/how-to-use-localbroadcastmanager –

回答

0

由於這兩個片段都在相同的Activity中,因此要在Activity類中添加一個方法,並在您想要更改其他片段內的某個片段時從一個片段中調用該方法。在觸摸用戶界面之前,請確保通過調用isAdded()方法將要修改的片段「添加」到片段中。

0

假設你有兩個片段FragmentA和片段B. 現在FragmentA有一些ImageView和TextView,你想從FragmentB改變。假設在ViewPager FragmentA是在位置0和FragmentB的位置是1 現在,當你想改變的數據做如下:

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

你好,我試過了,但它不適合我。任何想法爲什麼? – tomhogenkamp

+0

它應該工作,如果所有片段和viewPager正確實施。 –