在片段中,如何找到定义在 activity 布局中的视图?
In a fragment, how to find a view defined in the activity's layout?
在我的activity 布局 中,我有一个视图,我想从其附加片段中访问。
我该怎么做?
通常,从片段,找到在片段布局中定义的视图(所以这是另一个用例),我只是使用 inflater
来膨胀片段的布局,并调用 findVieById
.
但是由于我的视图是在 activity 的布局中定义的,所以我不能这样做。
我可以使用getActivity().findViewById
吗?
这样做:
((YourActivityName)getActivity()).findViewById
或者您可以对视图执行 findViewById
并使其在您的 activity 中成为全局视图,并且可以像这样访问它:
((YourActivityName)getActivity()).viewName
这不是一个好的做法。你不应该那样做。 Activity 应该自己处理它的视图,您可以使用接口触发该处理函数。看看这个。
https://developer.android.com/training/basics/fragments/communicating
In my activity's layout, I have a view which I'd want to access from its attached fragment.
不,你不想。
How could I do it?
getActivity().findViewById(R.id.blah)
,但你不应该。
But since my view is defined in the activity's layout, I can't do this.
从技术上讲可以,只是不应该。
Could I use getActivity().findViewById?
是的,但你不应该。
至于正确答案,这就是他们创建 Android Architecture Components: ViewModel / LiveData
的原因 - 这样您就不会被诱惑直接访问视图。您可以在一处修改通过 ViewModel 共享的 data/state,感谢 LiveData,所有观察者都将使用它进行更新。
因此您永远不必直接接触视图,您只需要更新数据。
public class MyActivity extends AppCompatActivity {
private MyViewModel myViewModel;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
myViewModel = ViewModelProviders.of(this).get(MyViewModel.class);
myViewModel.myData().observe(this, (data) -> {
if(data == null) return;
updateViews(data);
});
}
}
和
public class MyViewModel extends ViewModel {
public MyViewModel() {}
private MutableLiveData<MyData> mutableData = new MutableLiveData<>();
public LiveData<MyData> myData() {
return mutableData;
}
public void updateData(MyData newData) {
mutableData.postValue(newData);
}
}
和
public class MyFragment extends Fragment {
private MyViewModel myViewModel;
@Override
protected void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
myViewModel = ViewModelProviders.of(getActivity()).get(MyViewModel.class);
myViewModel.myData().observe(getViewLifecycleOwner(), (data) -> {
if(data == null) return;
updateViews(data);
});
}
}
这样:
中那样弄乱界面
您不需要直接触摸视图,只需触摸数据
你跟上 the best practices introduced in 2017 (see also this video and this video Google I/O 2017)
您也可以在官方指南中找到此技术 here。
在我的activity 布局 中,我有一个视图,我想从其附加片段中访问。
我该怎么做?
通常,从片段,找到在片段布局中定义的视图(所以这是另一个用例),我只是使用 inflater
来膨胀片段的布局,并调用 findVieById
.
但是由于我的视图是在 activity 的布局中定义的,所以我不能这样做。
我可以使用getActivity().findViewById
吗?
这样做:
((YourActivityName)getActivity()).findViewById
或者您可以对视图执行 findViewById
并使其在您的 activity 中成为全局视图,并且可以像这样访问它:
((YourActivityName)getActivity()).viewName
这不是一个好的做法。你不应该那样做。 Activity 应该自己处理它的视图,您可以使用接口触发该处理函数。看看这个。
https://developer.android.com/training/basics/fragments/communicating
In my activity's layout, I have a view which I'd want to access from its attached fragment.
不,你不想。
How could I do it?
getActivity().findViewById(R.id.blah)
,但你不应该。
But since my view is defined in the activity's layout, I can't do this.
从技术上讲可以,只是不应该。
Could I use getActivity().findViewById?
是的,但你不应该。
至于正确答案,这就是他们创建 Android Architecture Components: ViewModel / LiveData
的原因 - 这样您就不会被诱惑直接访问视图。您可以在一处修改通过 ViewModel 共享的 data/state,感谢 LiveData,所有观察者都将使用它进行更新。
因此您永远不必直接接触视图,您只需要更新数据。
public class MyActivity extends AppCompatActivity {
private MyViewModel myViewModel;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
myViewModel = ViewModelProviders.of(this).get(MyViewModel.class);
myViewModel.myData().observe(this, (data) -> {
if(data == null) return;
updateViews(data);
});
}
}
和
public class MyViewModel extends ViewModel {
public MyViewModel() {}
private MutableLiveData<MyData> mutableData = new MutableLiveData<>();
public LiveData<MyData> myData() {
return mutableData;
}
public void updateData(MyData newData) {
mutableData.postValue(newData);
}
}
和
public class MyFragment extends Fragment {
private MyViewModel myViewModel;
@Override
protected void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
myViewModel = ViewModelProviders.of(getActivity()).get(MyViewModel.class);
myViewModel.myData().observe(getViewLifecycleOwner(), (data) -> {
if(data == null) return;
updateViews(data);
});
}
}
这样:
- 中那样弄乱界面
您不需要直接触摸视图,只需触摸数据
你跟上 the best practices introduced in 2017 (see also this video and this video Google I/O 2017)
您也可以在官方指南中找到此技术 here。