我怎样才能完成TabLayout的片段?

时间:2017-06-28 04:12:35

标签: android android-fragments

我有MainActivityHomeTabs有三个标签(A B C),我在tab C上设置了刷新。

我的结构是当我在标签C上触发onRefresh时,我会切换到MainActivity 并再次加载数据以显示HomeTabs

我的问题是当我点击finish();时,布局会显示tab C

我尝试完成Fragment使用,如:     getActivity().getSupportFragmentManager().beginTransaction().remove(this).commit(); 要么 ((MainActivity)getActivity()).removeFragment(getActivity());

这两个都没有用,当我点击回来时,我仍然无法立即完成应用。

有人可以告诉我我错过了哪一步,我将不胜感激。

我的HomeTabs扩展Fragment使用ViewPagerTabLayout添加三个标签

MainActivity:

public class MainActivity extends AppCompatActivity {

    private FrameLayout frameLayout;
    private Toolbar toolBar;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
frameLayout = (FrameLayout) findViewById(R.id.frameLayout);
        // Load the main Fragment
        if (savedInstanceState == null) {
            switchFragment(HomeTabs.newInstance());
        }
        //take the onRefresh data,send data to HomeTabs and open tab C
        if (getIntent().hasExtra("refresh")) {
            boolean isRefresh = getIntent().getExtras().getBoolean("refresh");
            if (isRefresh) {

                Bundle bundle = new Bundle();
                bundle.putBoolean("refresh", isRefresh);
                HomeTabs homeTabs = new HomeTabs();
                homeTabs.setArguments(bundle);
                switchFragment(homeTabs);
            }
        }
    }

    public void switchFragment(Fragment fragment) {
        FragmentManager manager = getSupportFragmentManager();
        FragmentTransaction transaction = manager.beginTransaction();
        transaction.replace(R.id.frameLayout, fragment);
        transaction.addToBackStack(null);
        transaction.commit();
    }
    // I try to finsh my tab C , it's no working
    public void removeFragment(Activity activity) {
        activity.onBackPressed();
    }
@Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            new DialogHandler(this).quickDialog(
                    getResources().getString(R.string.quick),
                    getResources().getString(R.string.confirm),
                    getResources().getString(R.string.cancel),
                    new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            // If i onRefrsh three times , i will finsh three times... here is my issue.
                            finish();
                        }
                    }, new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {

                        }
                    });
        }
        return super.onKeyDown(keyCode, event);
    }
}

这是我的标签C片段刷新回调方法:

public class MyLineChart extends Fragment implements SwipeRefreshLayout.OnRefreshListener{

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_my_line_chart, container, false);

        //.....................

        return view;
    }
       @Override
        public void onRefresh() {
            refreshLayout.setRefreshing(false);
            // Both of them are no working.
            //((MainActivity)getActivity()).removeFragment(getActivity());
            //getActivity().getSupportFragmentManager().beginTransaction().remove(this).commit();
            Intent intent = new Intent(getActivity(),MainActivity.class);
            intent.putExtra("refresh", true);
            startActivity(intent);
        }

最后,我的HomeTabs片段采用日期并显示标签C:

Bundle bundle = getArguments();
    if (bundle != null) {
        boolean isRefresh = bundle.getBoolean("refresh");
        if (isRefresh) {
            //tab C position is 2
            tabLayout.getTabAt(2).select();
        }
    }

2 个答案:

答案 0 :(得分:1)

您可以在片段中添加一个可以触发父活动中的函数的侦听器 这意味着你需要在fragmentC代码中添加一个接口

public class MyLineChart extends Fragment implements SwipeRefreshLayout.OnRefreshListener {
    private MyLineChartListener fragmentListener;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_my_line_chart, container, false);

        //.....................

        return view;
    }

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);

        if (context instanceof MyLineChartListener) {
            fragmentListener = (MyLineChartListener) context;
        } else {
            // throw an error
        }

    }

    @Override
    public void onRefresh() {
        refreshLayout.setRefreshing(false);
        // Both of them are no working.
        //((MainActivity)getActivity()).removeFragment(getActivity());
        //getActivity().getSupportFragmentManager().beginTransaction().remove(this).commit();
        fragmentListener.onSettingRefresh();
    }

    public interface MyLineChartListener {
        void onSettingRefresh();
    }
}

然后你需要在MainActivity代码中实现如下的监听器

public class MainActivity extends AppCompatActivity implements MyLineChart.MyLineChartListener {

    private FrameLayout frameLayout;
    private Toolbar toolBar;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        frameLayout = (FrameLayout) findViewById(R.id.frameLayout);
        // Load the main Fragment
        if (savedInstanceState == null) {
            switchFragment(HomeTabs.newInstance());
        }

    }

    public void switchFragment(Fragment fragment) {
        FragmentManager manager = getSupportFragmentManager();
        FragmentTransaction transaction = manager.beginTransaction();
        transaction.replace(R.id.frameLayout, fragment);
        transaction.addToBackStack(null);
        transaction.commit();
    }

    // I try to finsh my tab C , it's no working
    public void removeFragment(Activity activity) {
        activity.onBackPressed();
    }

    // this function will be called when the fragment is refreshed
    @Override
    public void onSettingRefresh() {
        Bundle bundle = new Bundle();
        bundle.putBoolean("refresh", true);
        HomeTabs homeTabs = new HomeTabs();
        homeTabs.setArguments(bundle);
        switchFragment(homeTabs);
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            new DialogHandler(this).quickDialog(
                    getResources().getString(R.string.quick),
                    getResources().getString(R.string.confirm),
                    getResources().getString(R.string.cancel),
                    new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            // If i onRefrsh three times , i will finsh three times... here is my issue.
                            finish();
                        }
                    }, new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {

                        }
                    });
        }
        return super.onKeyDown(keyCode, event);
    }
}

答案 1 :(得分:1)

尝试此解决方案,在Refresh点击时再次启动活动时添加以下代码: -

intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_SINGLE_TOP);

更新您的MainActivity.java

1)在MainActivity中添加功能

public void refreshFragment() {
    Bundle bundle = new Bundle();
    bundle.putBoolean("refresh", isRefresh);
    HomeTabs homeTabs = new HomeTabs();
    homeTabs.setArguments(bundle);
    switchFragment(homeTabs);
}

现在从Fragment Tab C调用,只需替换startActivity(refresh)代码:

MainActivity mainActivity = (MainActivity) getActivity();
mainActivity.refreshFragment();