在选项卡布局的片段内访问自动完成

Posted

技术标签:

【中文标题】在选项卡布局的片段内访问自动完成【英文标题】:Access AutoComplete inside Fragment of Tab Layout 【发布时间】:2020-04-30 13:15:29 【问题描述】:

以下是我的 onCreate 代码:

protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);

        Log.i(TAG, "Inside Base Drawer...");

        mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());
        // Set up the ViewPager with the sections adapter.
        mViewPager = (ViewPager) findViewById(R.id.container);
        mViewPager.setAdapter(mSectionsPagerAdapter);

        TabLayout tabLayout = (TabLayout) findViewById(R.id.tab_layout);

        mViewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));
        tabLayout.addOnTabSelectedListener(new TabLayout.ViewPagerOnTabSelectedListener(mViewPager)

            @Override
            public void onTabSelected(TabLayout.Tab tab)
                tabPosition = tab.getPosition();
            
        );

    

以下是我的 FragmentPageAdapter,用于滑动标签布局

public class SectionsPagerAdapter extends FragmentPagerAdapter 

    public SectionsPagerAdapter(FragmentManager fm) 
        super(fm);
    

    @Override
    public Fragment getItem(int position) 
        switch (position)
            case 0:
                Tab1Fragment tab1 = new Tab1Fragment();
                return tab1;
            case 1:
                Tab1Fragment tab2 = new Tab2Fragment();
                return tab2;
            case 2:
                Tab1Fragment tab3 = new Tab3Fragment();
                return tab3;
            default:
                return null;
        

    

    @Override
    public int getCount() 
        return 3;
    

以下是tabFragment代码:

public class Tab1Fragment extends Fragment 
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup viewGroup, Bundle savedInstanceState)
        return inflater.inflate(R.layout.tab_activity_sheet_details_tab1, viewGroup, false);
    

我在选项卡布局中有一个自定义 autocompleteTextView (tab_activity_sheet_details_tab1) 以下是相同的代码:

<com.example.user.package.TabLayoutActivity.AutoCompleteAdapter.HistoryAutoCompleteTextView
            android:id="@+id/history_text"
            android:layout_
            android:layout_
            android:inputType="textCapCharacters"
            android:imeOptions="flagNoExtractUi|actionSearch"/>

但是,我无法从 TabLayoutActivity 访问此元素。片段视图膨胀后访问它的最佳方法是什么? 请注意,所有三个选项卡布局中都有类似的项目。 是否需要一个单独的适配器来保存所有三个片段布局并访问它们?如果是这样,我可以从哪个生命周期元素访问它们? P.S.:如果可能的话,我正在寻找对片段的非适配器访问(可能通过“布局 id”)?

【问题讨论】:

【参考方案1】:

这样的事情会将视图暴露给外界:

public class Tab1Fragment extends Fragment 
    View mView;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup viewGroup, Bundle savedInstanceState)
        mView = inflater.inflate(R.layout.tab_activity_sheet_details_tab1, viewGroup, false);
        return mView;
    

    public HistoryAutoCompleteTextView getTextView() 
      return (HistoryAutoCompleteTextView)mView.findViewById(R.id.history_text);
    

那么就可以从fragment中获取了:

   textView = ((Tab1Fragment)fragment).getTextView()

但从软件设计的角度来看,您可能不应该这样做,而是考虑完全在 Fragment 中管理此视图,并且只公开收集的数据。

【讨论】:

在这种情况下,您认为正确的做法是从 onActivityCreated() 访问 Fragment 内的元素并将数据返回到 onStop() 处的活动吗?这两个函数都将驻留在 Tab1Fragments 类中? 是的,有点。将 setData(MyData data) 和 getData() 方法添加到 Tab1Fragment 类将允许您将数据加载到片段中并从片段中检索修改后的数据。这些方法会负责将数据加载到 UI 元素(如文本字段)中,并从中检索数据。然后,在您的活动中,您需要在片段呈现时(setData)和删除之前(getData)在片段上使用这些方法。 谢谢。你能不能提供一点帮助。我应该将 setdata 和 getdata 放在 Activity 类的什么位置?似乎可以访问 Fragment 对象的唯一位置是在 Activity 类的 SectionsPagerAdapter 内。我正在做的是将它们定义为活动类中的公共变量。我可以直接从那里设置和获取数据吗?即使布局不是布局不膨胀,如何设置数据? 活动的 onAttachFragment() 方法是一种选择。 Fragment 的 UI 在调用时并未创建,因此 setData() 方法只会将给定的数据存储在 Fragment 中,但是您可以使用 Fragment 的 onCreateView() 方法中的数据将数据加载到用户界面。 非常感谢。我会检查详细信息,然后再回来

以上是关于在选项卡布局的片段内访问自动完成的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式使用选项卡更改片段的选项卡索引

使用带有选项卡布局的自定义视图时无法从选项卡中删除填充

我们如何在android中使用firebase Realtime数据库动态设置选项卡布局的选项卡标题?

如何在列表视图之上设置选项卡布局但在 Android 中不覆盖?

使用选项卡布局从活动中启动选项卡片段

使用Android ViewPager2在回收器视图中滚动到底部时自动更改选项卡项