【问题标题】:Android Fragment onCreateView - inflating every time it's called?Android Fragment onCreateView - 每次调用时都会膨胀?
【发布时间】:2015-10-09 09:20:32
【问题描述】:

我一直在对我的应用进行一些调试,以尝试弄清楚生命周期发生了什么。

我有一些选项卡,每个选项卡内容是不同的片段,每次更改选项卡时都会在相应的片段中调用 onCreateView。

在我的一些 onCreateViews 中,我目前正在模拟一些数据并注入表行等,然后每次都膨胀视图。如下例所示:

 @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {


    Log.d(LOG_TAG, "******************* onCreateView() is being called in the Container Fragment *********************");
    // Inflate the layout for this fragment
    View rootView = inflater.inflate(R.layout.fragment_patient, container, false);
    mTabHost = (FragmentTabHost)rootView.findViewById(android.R.id.tabhost);
    mTabHost.setup(getActivity(), getChildFragmentManager(), android.R.id.tabcontent);

    //Set up tabs
    mTabHost.addTab(mTabHost.newTabSpec("home_addresses").setIndicator("Home Addresses"), HomeAddressesFragment.class, null);
    mTabHost.addTab(mTabHost.newTabSpec("postal_addresses").setIndicator("Postal Addresses"), PostalAddressesFragment.class, null);
    mTabHost.addTab(mTabHost.newTabSpec("temp_addresses").setIndicator("Temporary Addresses"), TemporaryAddressesFragment.class, null);
    mTabHost.addTab(mTabHost.newTabSpec("email_other").setIndicator("Email / Other"), TemporaryAddressesFragment.class, null);
    mTabHost.addTab(mTabHost.newTabSpec("tel_fax").setIndicator("Telephone & Fax"), TemporaryAddressesFragment.class, null);

    //Set to home addresses tab
    mTabHost.setCurrentTab(0);

    tempAddressBtn = (Button)rootView.findViewById(R.id.temp_addr_tab_btn);
    tempAddressBtn.setTransformationMethod(null);
    tempAddressBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            tabHandler(v);
        }
    });
    postalAddressBtn = (Button)rootView.findViewById(R.id.postal_addr_tab_btn);
    postalAddressBtn.setTransformationMethod(null);
    postalAddressBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            tabHandler(v);
        }
    });
    homeAddressBtn = (Button)rootView.findViewById(R.id.home_addr_tab_btn);
    homeAddressBtn.setTransformationMethod(null);
    homeAddressBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            tabHandler(v);
        }
    });
    telFaxBtn = (Button)rootView.findViewById(R.id.tel_fax_tab_btn);
    telFaxBtn.setTransformationMethod(null);
    telFaxBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            tabHandler(v);
        }
    });
    emailOtherBtn = (Button)rootView.findViewById(R.id.email_other_tab_btn);
    emailOtherBtn.setTransformationMethod(null);
    emailOtherBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            tabHandler(v);
        }
    });


    return rootView;
}

我的问题是每次调用 onCreateView 方法时我都应该这样做吗?视图是否已经缓存在某处?

我在教程中看到的代码看起来有点像:

@Override
protected void onCreate(Bundle savedInstance) {
    super.onCreate(savedInstance);
    setContentView(R.layout.pager_activity);
    if (savedInstance == null) {
        PagerFragment frag = PagerFragment.newInstance(buildPagerData());
        FragmentManager fm = getSupportFragmentManager();
        fm.beginTransaction().add(R.id.layout_fragments, frag, PAGER_TAG).commit();
    }
    findViewById(R.id.btnFragments).setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            changeFragmentVisibility();
        }
    });
}

我知道上面示例中的这个 Fragment 是从 FragmentActivity 扩展而来的,而我的只是从 Fragment 扩展而来,但它正在使用片段管理器并在决定实例化新片段之前检查状态是否为空。

编辑:我也猜想这种情况发生在 onCreate 而不是 onCreateView 发生的频率较低?

我想知道这是否是我应该做的事情,或者是否可以继续我的方式?

【问题讨论】:

    标签: android fragment


    【解决方案1】:

    在我看来,您应该从父 Activity 管理您的标签。每个Fragment 应负责 UI 的一部分。

    这种方法的另一个优点是每个Fragment 布局都会更容易一些。如果需要,应用不同的容器会更容易(例如ViewPager)。

    【讨论】:

    • 这个片段里面有一组水平标签?那么还应该管理父活动中的那组选项卡吗?父活动片段确实管理垂直选项卡,这似乎是合乎逻辑的。
    • 你的意思是你的视图中有两组水平标签?
    • 不,我有一组垂直选项卡,每个选项卡显示一个适合该选项卡的片段。在第一个选项卡上,其内容包含一组水平选项卡。我粘贴到示例中的代码用于片段中包含的水平选项卡。
    • 好的,我现在明白了。我想你真的无能为力。 onCreateView 经常被调用,因为一路上 - 当片段未显示时 - 你可以 e。 G。旋转您的屏幕并为横向模式提供完全不同的布局。我假设FragmentManager 正在对那个进行拍摄。您应该检查您实际显示您的位置 Fragment 带有标签,并检查您是否在每次要显示它时创建一个新的 Fragment 实例,如果是,请在创建之前先尝试 findFragmentWithTag一个新的。
    • 好的,在那个地方我也在做同样的事情,因为它也是一个片段,所以在那个地方我应该添加一个标签,然后尝试找到一个带有标签的现有片段。我现在就试试。干杯。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-01
    • 1970-01-01
    相关资源
    最近更新 更多