代码之家  ›  专栏  ›  技术社区  ›  JarsOfJam-Scheduler

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

  •  1
  • JarsOfJam-Scheduler  · 技术社区  · 6 年前

    在我的 活动布局 ,我有一个要访问的视图

    正常地 碎片 ,以查找已定义的视图 在片段的布局中 (所以这是另一个用例),我只使用 inflater 膨胀碎片的布局,并调用 findVieById .

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

    getActivity().findViewById ?

    2 回复  |  直到 6 年前
        1
  •  1
  •   EpicPandaForce Jigar Joshi    6 年前

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

    不,你不想。

    我怎么做呢?

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

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

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

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


    至于正确的答案,这就是为什么他们创造了 Android Architecture Components: 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
  •  1
  •   Harvey    6 年前

    这不是一个好的做法。你不应该那样做。活动应该自己处理它的视图,您可以使用接口触发该句柄函数。看看这个。

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

        3
  •  0
  •   Suraj Vaishnav    6 年前

    ((YourActivityName)getActivity()).findViewById
    

    findViewById 查看并使其成为您活动中的全局视图,您可以通过以下方式访问它:

    ((YourActivityName)getActivity()).viewName