2012-12-07 81 views
1

我有两个片段。我使用的接口通信的一个片段与另一:片段之间的通信android

public class FragmentLanguages extends ListFragment { 
LanguageArrayAdapter adapter; 
OnLanguageChangedListener mCallback; 

public interface OnLanguageChangedListener { 
    public void onLanguageSelected(int position); 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 

    View view = inflater.inflate(R.layout.languages, null); 

    return view; 
} 

@Override 
public void onActivityCreated(Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 
    Language languages[] = new Language[] { 
      new Language(R.drawable.ic_flag_german, "German"), 
      new Language(R.drawable.ic_flag_spanish, "Spanish"), 
      new Language(R.drawable.ic_flag_russian, "Russian"), 
      new Language(R.drawable.ic_flag_ukrainian, "Ukrainian") }; 

    adapter = new LanguageArrayAdapter(getActivity(), R.layout.list_row, 
      languages); 
    getListView().setOnItemClickListener(new OnItemClickListener() { 

     @Override 
     public void onItemClick(AdapterView<?> parent, View view, 
       int position, long id) { 
      adapter.setSelectedItem(position); 
      mCallback.onLanguageSelected(position + 1); 
     } 
    }); 
    setListAdapter(adapter); 
} 

public static class Language { 
    public int image; 
    public String text; 

    public Language() { 
     super(); 
    } 

    public Language(int image, String text) { 
     super(); 
     this.image = image; 
     this.text = text; 
    } 
} 

public void setOnLanguageChangedListener(OnLanguageChangedListener mCallback) { 
    this.mCallback = mCallback; 
} 

}

和另一

public class FragmentCircles extends Fragment implements OnClickListener, 
    OnLanguageChangedListener { ... 
..... 
    @Override 
public void onLanguageSelected(int position) { 
    currentLang = position; 
    translationCircle.removeAllViews(); 
    String strSelect = "SELECT Translation FROM Translation WHERE Lang_Id=" 
      + currentLang + " ORDER BY Word_Id ASC"; 
    translationList = DataBaseHelper.getInstance(getActivity()) 
      .SelectTranslationList(strSelect); 
    Log.i("Lang ", "changed " + currentLang); 


    calculateCentreTranslation(lLabelRadius, width, height); 
} 

但屏幕旋转后,当我在ListFragment选择一些项目它给了我一个错误

12-07 19:06:15.163: E/AndroidRuntime(436): java.lang.NullPointerException 

at line

   mCallback.onLanguageSelected(position + 1); 

看起来mCallback为空。但我如何解决它?

+0

你在哪里调用setOnLanguageChangedListener? –

+0

我在HTC上看到,旋转后,类方法OnCreate被调用,重置所有我的值。你可以尝试使它成为静态的,但更好地测试娱乐是否发生并在构造函数中执行。 – dmaij

回答

0

在android中,当您从纵向切换到横向或者反向时,活动被重新创建,所以如果您想保留一些数据,您必须使用Bundle saveInstanceState管理这些数据。

1

您的FragmentLanguages必须通知您的FragmentActivity依次通知其他片段。这确保没有片段链接在一起,如果其中一个在另一个通知它时没有实例化,则可以触发NullPointerExceptions

所以,你的界面OnLanguageChangedListener停留在你的LanguagesFragment

FragmentActivity必须实现setOnLanguageChangedListener

FragmentLanguages

@Override 
public void onAttach(Activity activity) { 
    super.onAttach(activity); 
    onLanguageChangedListener = (onLanguageChangedListener) activity; 
} 

由于onAttach()被称为甚至在onCreate()你可以在你的片段使用只要你想要:

onLanguageChangedListener.onLanguageChanged(...); 

在你FragmentActivity它实现OnLanguageChangedListener您需要重写此:

@Override 
public void onLanguageChanged(...) { 
    // here you implement the logic to notify other fragments 
}