【问题标题】:Switching to a different fragment while staying in the same tab in a Sliding Tab Layout在滑动选项卡布局中的同一选项卡中切换到不同的片段
【发布时间】:2015-05-24 22:31:46
【问题描述】:

我有一个滑动选项卡布局,其中包含三个选项卡的回收站视图。第一个选项卡包含卡片视图。实现以下目标的最佳方法是什么:当您单击第一张卡片内的按钮时,卡片视图(一个片段)会被另一个卡片视图(另一个片段)替换,同时保持在同一个选项卡中。

我知道我必须创建一个新片段并使用事务。我只是不知道在哪里。我把它放在适配器里吗?如果可能的话,我想在第一个卡片视图的 XML 布局中使用 onClick 作为按钮。

Sliding Tab How-to

Sliding Tab Layout

Sliding Tab Strip

主活动:

import android.content.Intent;
import android.os.Bundle;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;

public class MainActivity extends AppCompatActivity  {

    private Toolbar toolbar;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        toolbar = (Toolbar) findViewById(R.id.app_bar);
        setSupportActionBar(toolbar);


        // Get the ViewPager and set it's PagerAdapter so that it can display items
        ViewPager viewPager = (ViewPager) findViewById(R.id.viewpager);
        viewPager.setAdapter(new MainFragmentPageAdapterForTabs(getSupportFragmentManager(),
                MainActivity.this));

        // Give the SlidingTabLayout the ViewPager
        SlidingTabLayout slidingTabLayout = (SlidingTabLayout) findViewById(R.id.sliding_tabs);
        // Center the tabs in the layout
        slidingTabLayout.setDistributeEvenly(true);
        slidingTabLayout.setViewPager(viewPager);

    }


    public void bodyButtonAction(View view){
        Intent intentBody = new Intent(MainActivity.this, MainActivity.class);
        startActivity(intentBody);
    }

标签片段:

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

// In this case, the fragment displays simple text based on the page
public class MainPageFragmentForTabs extends Fragment {
    public static final String ARG_PAGE = "ARG_PAGE";

    private int mPage;

    public static MainPageFragmentForTabs newInstance(int page) {

        Bundle args = new Bundle();
        args.putInt(ARG_PAGE, page);
        MainPageFragmentForTabs fragment = new MainPageFragmentForTabs();
        //body fragment
        Fragment bodyFragment = new MainPageFragmentForTabs();

        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mPage = getArguments().getInt(ARG_PAGE);


    }


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


        View view = null;


        if(mPage==1){
            View view1 = inflater.inflate(R.layout.main_fragment_page, container, false);
            FragmentActivity a = getActivity();

            //recycler
            RecyclerView recyclerView = (RecyclerView) view1.findViewById(R.id.my_recycler_view);
            recyclerView.setHasFixedSize(true);

            //layout manager
            LinearLayoutManager manager = new LinearLayoutManager(a);
            manager.setOrientation(LinearLayoutManager.VERTICAL);
            recyclerView.setLayoutManager(manager);


            MainAdapterCV1 ca = new MainAdapterCV1();
            recyclerView.setAdapter(ca);

            view=view1;

        }
        if(mPage==2){
            View view2 = inflater.inflate(R.layout.main_fragment_page, container, false);
            //stand-in code
            TextView textView = (TextView) view2;
            textView.setText("Fragment #" + mPage);
            //stand-in code
            view=view2;

        }
        if(mPage==3){
            View view3 = inflater.inflate(R.layout.main_fragment_page, container, false);
            //stand-in code
            TextView textView = (TextView) view3;
            textView.setText("Fragment #" + mPage);
            //stand-in code
            view=view3;

        }

        return view;
    }
}

第一个卡片视图的适配器:

import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class MainAdapterCV1 extends RecyclerView.Adapter<MainAdapterCV1.CardViewHolder> {


    //
    @Override
    public int getItemCount() {
        return 1;
    }

    @Override
    public void onBindViewHolder(CardViewHolder cardViewHolder, int i) {

    }
    //
    @Override
    public CardViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
        View itemView = LayoutInflater.
                from(viewGroup.getContext()).
                inflate(R.layout.main_card_view1, viewGroup, false);

        return new CardViewHolder(itemView);
    }

    public static class CardViewHolder extends RecyclerView.ViewHolder {


        public CardViewHolder(View v) {
            super(v);

        }
    }
}

【问题讨论】:

  • 我也使用了谷歌示例代码滑动标签布局!它工作正常。

标签: java android xml android-fragments tabs


【解决方案1】:

从技术上讲,您可以在任何您想要的地方添加或替换片段。但是,我认为在适配器中执行此操作比在片段中执行此操作更合乎逻辑。一个原因是适配器通常具有单击事件侦听器代码,而我在发布的代码中没有看到它,这很好。替换片段的示例代码(使用您的代码):

MainPageFragmentForTabs myFragment = MainPageFragmentForTabs.newInstance(page);

FragmentTransaction transaction = thisActivity.getFragmentManager().beginTransaction();
// Replace the Fragment (set in MainActivity) with this fragment.
transaction.replace(R.id.sample_content_fragment, myFragment, "MainPage");

transaction.addToBackStack(null);       // support the Back key
transaction.commit();

【讨论】:

  • 在查看了带有标签的应用程序(Goodreads 和 Duolingo)之后,我意识到当用户点击主片段中的按钮时,它们并没有保留标签。所以,(像他们一样)我决定只在单击新片段时保留工具栏。无需交易。如果我需要在其他地方切换片段,您的回答可能仍然有用。这种可能性很大。感谢您提供有关适配器的信息!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-28
  • 1970-01-01
  • 2018-08-20
  • 2018-05-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多