我有一个活动和一个片段。 主要活动布局:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:id="@+id/btn_login"
android:text="Login"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<FrameLayout
android:id="@+id/fl_content"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
将片段替换为fl_content后:
FragmentManager fm = getFragmentManager();
FragmentTransaction fragmentTransaction = fm.beginTransaction();
fragmentTransaction.replace(R.id.fl_conent, new MyFragment());
fragmentTransaction.commit();
从MyFragment,我想要更改btn_login的文字/颜色,据我所知,我可以: 第一种方式,来自MyFragment内部:
Button btnLogin = (Button) getActivity().findViewById(R.id.btn_login);
btnLogin.setText("Another text");
这种方式我认为片段不应该访问活动的登录按钮(以及任何其他活动的视图,如果有的话,即使我们可以),因为它违反了封装或松散编程。
第二种方式:创建一个监听器/回调
public interface ChangeListener {
void onChanged();
}
然后将其设置为片段,从我实现此侦听器的活动
MyFragment myFragment = new MyFragment();
myFragment.setOnChangeListener(new ChangeListener() {
@Override
public void onChanged() {
btnLogin.setText("Another text");
}
}
fragmentTransaction.replace(R.id.fl_conent, myFragment);
fragmentTransaction.commit();
每当我需要更改btnLogin文本时,从MyFragment我只需拨打mChangeListener.onChanged();
然后活动将改变它的btnLogin byhelf。这种方式保持封装 - 松散的合作。
我认为我们应该使用第二种方式,或者可能是另一种未列在这里的方式,你怎么样?我很高兴听到你的意见。 谢谢!
@Jim Coven:什么是&#34;来自Activity的startActivityForResults,然后在片段&#34;中使用setResults。你能给我一些代码片段来理解这个:D
答案 0 :(得分:0)
我更喜欢第二种方式。但是,仍然需要外部调用来设置侦听器。或者,如果片段的目的是更新活动中的结果,您可以尝试:
来自Activity的startActivityForResults,然后在片段中使用setResults。