简体   繁体   English

在transaction.com发布之前调用片段的onCreate

[英]Fragment's onCreate is being called before transaction.commit

I have multiple fragments in viewpager. 我在viewpager中有多个片段。 Fragment A, Fragment B , Fragment C and Fragment D. Fragment C is replacing itself with another fragment which extends list fragment. 片段A,片段B,片段C和片段D.片段C用另一个扩展列表片段的片段替换自身。 I want to replace the fragment when only Fragment C is visible. 我只想在片段C可见时替换片段。 because there is some background AsyncTask being performed which should be done when the fragment C is selected. 因为有一些背景AsyncTask正在执行,应该在选择片段C时完成。 I have replaced the fragment which works fine. 我已经取代了工作正常的片段。 But the problem is that its state is being saved. 但问题在于其状态正在得到拯救。 Because whenever Fragment C's neighbor is called The fragment replaced inside Fragment C is also called automatically 因为每当调用Fragment C的邻居时,Fragment C中替换的片段也会被自动调用

I have implemented all code. 我已经实现了所有代码。 I Just dont want to call the replacing fragment when Fragment C's neighbor Fragment is called 我只是不想在调用Fragment C的邻居Fragment时调用替换片段

public class VendorsListFragment extends Fragment {

private static final String TAG = VendorsActivity.class.getSimpleName();

@BindView(R.id.layoutAdViewBottomVendorActivity)
AdView mAdView;
View view;
boolean isLaunched= false;
boolean isRejected= false;

public VendorsListFragment() {
}

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    view = inflater.inflate(R.layout.activity_vendors, container, false);
    ButterKnife.bind(this, view);
    return view;
}

public void callNewFragment() {

        FragmentManager manager = getChildFragmentManager();
        FragmentTransaction ft = manager.beginTransaction();
        VendorFragment vendorFragment = new VendorFragment();

        ft.remove(vendorFragment);
        ft.replace(R.id.vendorFragmentContainer, new VendorFragment());
        //container is the ViewGroup of current fragment
        ft.addToBackStack(null);
        ft.commit();
        ft.commitAllowingStateLoss();
}
}

Activity which has ViewPager has following code 具有ViewPager的Activity具有以下代码

public class NetworkToolsActivity extends AppCompatActivity  {

TabLayout tabHost;
public ViewPager pager;
ViewPagerAdapter adapter;
private Resources res;
int tabPosition;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    initializeMainContext(this);

    setContentView(R.layout.activity_network_tools);
    res = this.getResources();
    Intent mIntent = getIntent();
    int selectedTab = mIntent.getIntExtra("tabPosition", 0);

    Toolbar toolbar = (Toolbar) this.findViewById(R.id.toolbar);
    toolbar.setTitleTextColor(Color.WHITE);
    setSupportActionBar(toolbar);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    getSupportActionBar().setDisplayShowHomeEnabled(true);
    this.setSupportActionBar(toolbar);
    tabHost = findViewById(R.id.tabHost);
    pager = (ViewPager) this.findViewById(R.id.pager );
    adapter = new ViewPagerAdapter(getSupportFragmentManager());
    pager.setAdapter(adapter);

    final int pageMargin = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 4, getResources()
            .getDisplayMetrics());
    pager.setPageMargin(pageMargin);

    tabHost.setupWithViewPager(pager);
    pager.setCurrentItem(selectedTab);
    pager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

        }

        @Override
        public void onPageSelected(int position) {
            if (position==6){
                VendorsListFragment frag  = (VendorsListFragment)adapter.getItem(position);
                frag.callNewFragment();
            }
        }

        @Override
        public void onPageScrollStateChanged(int state) {

        }
    });

} 
}

ViewPager Adapter Class ViewPager适配器类

public class ViewPagerAdapter extends FragmentStatePagerAdapter {
public ViewPagerAdapter(FragmentManager fm) {
    super(fm);
}

@Override
public Fragment getItem(int position) {
    Fragment frag = null;
    switch (position) {
        case 0:
            frag = new SpeedTestFragment();
            break;
        case 1:
            frag = new LanScanFragment();
            break;
        case 2:
            frag = new IpToolFragment();
            break;
        case 3:
            frag = new RouterFinderFragment();
            break;
        case 4:
            frag = new NetworkInformationFragment();
            break;
        case 5:
            frag = new ChannelRatingFragment();
            break;

        case 6:
            frag = new VendorsListFragment();
            break;
        case 7:
            frag = new AccessPointsFragment();
            break;
        case 8:
            frag = new ChannelRatingFragment();
            break;
        case 9:
            frag = new ChannelGraphFragment();
            break;
        case 10:
            frag = new TimeGraphFragment();
            break;

    }

    return frag;
}

@Override
public int getCount() {
    return 11;
}

@Nullable
@Override
public CharSequence getPageTitle(int position) {
    CharSequence sequence = null;
    switch (position) {
        case 0:
            sequence = "Speed Test";
            break;
        case 1:
            sequence = "Lan Scan";
            break;
        case 2:
            sequence = "Ip Tools";
            break;
        case 3:
            sequence = "Router Finder";
            break;
        case 4:
            sequence = "Network Information";
            break;
        case 5:
            sequence = "Available Channels";
            break;
        case 6:
            sequence = "Vendors";
            break;
        case 7:
            sequence = "Access Point";
            break;
        case 8:
            sequence = "Channel Rating";
            break;
        case 9:
            sequence = "Channel Graph";
            break;
        case 10:
            sequence = "Time Graph";
            break;

    }
    return sequence;
}

} }

You need to get ViewPager 's CurrentItem to see if it is at 3rd position. 您需要获取ViewPager的CurrentItem以查看它是否位于第3位。

if (getActivity() != null && ((YourActivity)getActivity()).viewPager.getCurrentItem() == 2){
    // Call ReplaceFragment here
}

inside Activity you need to implement ViewPager OnPageChangeListener . 在Activity中你需要实现ViewPager OnPageChangeListener It has onPageSelected method which gives you the position of the page. 它有onPageSelected方法,可以为您提供页面的位置。 It will always get called whenever you change your fragment. 无论何时更改片段,它都会被调用。

EDIT 编辑

inside onPageSelected 在onPageSelected内

if (position == 2){
   YourFragment frag  = (YourFragment)adapter.getItem(position)
   frag.callNewFragment()
}

EDIT 2 编辑2

import android.os.Parcelable;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentStatePagerAdapter;

import java.util.ArrayList;
import java.util.List;

public class ViewPagerAdapter extends FragmentStatePagerAdapter {
private final List<Fragment> mFragmentList = new ArrayList<>();
private final List<String> mFragmentTitleList = new ArrayList<>();

public ViewPagerAdapter(FragmentManager fm) {
    super(fm);
    mFragmentList.clear();
    mFragmentTitleList.clear();
}

@Override
public Fragment getItem(int position) {
    return mFragmentList.get(position);
}

@Override
public int getCount() {
    return mFragmentList.size();
}

public void addFragment(Fragment fragment, String title) {
    mFragmentList.add(fragment);
    mFragmentTitleList.add(title);
}

@Override
public Parcelable saveState() {
    return null;
}

@Override
public CharSequence getPageTitle(int position) {
    return mFragmentTitleList.get(position);
}
}

and then add fragment like below: 然后添加如下所示的片段:

adapter.addFragment(new SpeedTestFragment(), "Speed Test");

// add all 11 like above
adapter.notifyDataSetChanged();

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 在活动的onCreate之前调用片段的onCreateView - Fragment's onCreateView called before activity's onCreate 片段:onCreate被调用了4次 - Fragment: onCreate being called 4 times 尽管存在片段事务的commit(),但未调用onAttach()-方法 - onAttach()-method is not being called, although there is a commit() of the fragment transaction 在完成onCreate中的活动时,我的片段onCreateView在onCreate之前是如何调用的? - How is my fragment's onCreateView called before it's onCreate when finishing the activity in onCreate? Fragment 的 onCreate 和 onCreateView 没有被调用 - Fragment's onCreate and onCreateView are not called BroadcastReceiver onReceive 方法在 Fragment onCreate() 之前调用 - BroadcastReceiver onReceive method called before Fragment onCreate() 片段在没有调用 onCreate 的情况下初始化 - Fragment initialized without onCreate being called 在旋转之后,在onCreate()FragmentActivity之前调用onCreate()Fragment - After the rotate, onCreate() Fragment is called before onCreate() FragmentActivity 为什么 Fragment 的 onCreate() 有时会先于 Activity 的 onCreate() 被调用? - Why Fragment's onCreate() is sometimes called prior to Activity's onCreate()? 是否可以在 Activity 的 onCreate 完成之前调用片段的 onAttach? - Can a fragment's onAttach be called before the Activity's onCreate has finished?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM