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

时间:2019-03-10 18:28:42

标签: android android-layout android-fragments layout-inflater

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

我该怎么办?

通常,从片段中查找要在片段布局中定义的视图(所以这是另一个用例),我只是使用inflater扩大片段的布局,然后调用findVieById

但是由于我的视图是在活动的布局中定义的,所以我不能这样做。

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

3 个答案:

答案 0 :(得分:1)

这不是一个好习惯。你不应该那样做。活动应自行处理其视图,您可以使用界面触发该处理功能。检查一下。

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

答案 1 :(得分: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中找到此技术。

答案 2 :(得分:0)

执行以下操作:

((YourActivityName)getActivity()).findViewById

或者您可以对视图进行findViewById,并将其设置为活动中的全局视图,并可以像这样访问它:

((YourActivityName)getActivity()).viewName