在片段中,如何查找活动布局中定义的视图?

问题描述 投票:0回答:3

在我的活动的布局中,我有一个我想要从其附加片段访问的视图。

我怎么能这样做?

通常,从片段中,找到片段布局中定义的视图(因此它是另一个用例),我只是使用inflater来膨胀片段的布局,并调用findVieById

但由于我的视图是在活动的布局中定义的,所以我无法做到这一点。

我可以使用getActivity().findViewById吗?

android android-layout android-fragments layout-inflater
3个回答
1
投票

在我的活动的布局中,我有一个我想要从其附加片段访问的视图。

不,你不想。

我怎么能这样做?

getActivity().findViewById(R.id.blah),但你不应该。

但由于我的视图是在活动的布局中定义的,所以我无法做到这一点。

从技术上讲,你可以,你不应该。

我可以使用getActivity()。findViewById吗?

是的,但你不应该。


至于正确的答案,这就是他们创建Android Architecture Components: ViewModel / LiveData的原因 - 这样你就不会想要直接访问视图。您可以在一个地方修改通过ViewModel共享的数据/状态,并且由于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);
        });
    }
}

这条路:

您也可以在官方指南here中找到这种技术。


1
投票

这不是一个好习惯。你不应该这样做。 Activity应该自己处理它的视图,你可以使用接口触发该句柄功能。看一下这个。

https://developer.android.com/training/basics/fragments/communicating


0
投票

做这个:

((YourActivityName)getActivity()).findViewById

或者您可以为视图执行findViewById并使其在您的活动中全局化,并且可以像访问它一样访问它:

((YourActivityName)getActivity()).viewName
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.