访问视图从片段到活动视图的编程原则

时间:2015-07-07 17:05:18

标签: android android-fragments

我有一个活动和一个片段。 主要活动布局:

<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

1 个答案:

答案 0 :(得分:0)

我更喜欢第二种方式。但是,仍然需要外部调用来设置侦听器。或者,如果片段的目的是更新活动中的结果,您可以尝试:

来自Activity的startActivityForResults,然后在片段中使用setResults。