当前位置: 首页 > 知识库问答 >
问题:

为Master-Detail视图片段的“next”和“previous”方法创建一个类

董良策
2023-03-14

我想创建一个包含“上一个”和“下一个”按钮的类。类将有助于减少我必须为每个类中的每个按钮编写的重复代码的数量。例如,在FirstPage.Class片段内部调用以下代码

PageTransition.PageContents(CaseContent.GetSize(),getArguments().GetString(ARG_ITEM_ID),button_next,button_prev);

next和previous按钮存储在header.xml中,我在每个布局中都调用了它。我对代码使用了主-详细视图。

我尝试在CaseListActivity中为我的类使用相同的代码。但是,当我试图将代码添加到PageTransition内部的nextPage()方法时,getSupportFragmentManager遇到了问题。

Bundle参数=new Bundle();片段;arguments.putString(firstpage.arg_item_id,id);片段=新的FirstPage();fragment.SetArguments(参数);getSupportFragmentManager().BeginTransaction()
.Replace(r.id.case_detail_container,fragment).Commit();

有更好的方法来构造我的转换类吗?

CaseListActivity.java

public class CaseListActivity extends AppCompatActivity {

    ....

    //Method:- direct user to selected Item page

        void onSelectedMenuItem(String id, View v) {

            Bundle arguments = new Bundle();
            Fragment fragment;

            //in landscape
            switch (id) {
                case "1":
                    arguments.putString(FirstPage.ARG_ITEM_ID, id);
                    fragment = new FirstPage();
                    break;

                ... // case continues untill 12

                    break;
                case "11":
                    arguments.putString(ElevethPage.ARG_ITEM_ID, id);
                    fragment = new ElevethPage();

                    break;
                case "12":
                    arguments.putString(LastPage.ARG_ITEM_ID, id);
                    fragment = new LastPage();

                    break;
                default:
                    arguments.putString(FirstPage.ARG_ITEM_ID, id);
                    fragment = new FirstPage();
                    break;
            }

            fragment.setArguments(arguments);
            getSupportFragmentManager().beginTransaction()
                    .replace(R.id.case_detail_container, fragment)
                    .commit();

            //in potrait
            if (onePane) {

                //hide recyclerview list and show containerview
                final DisplayMetrics displayMetrics = new DisplayMetrics();
                getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);

                assert recyclerView != null;
                final ViewGroup.LayoutParams paramsRecyclerView = recyclerView.getLayoutParams();
                assert containerView != null;
                final ViewGroup.LayoutParams paramsContainerView = containerView.getLayoutParams();
                paramsRecyclerView.width = 0;
                paramsContainerView.width = displayMetrics.widthPixels;
                recyclerView.setLayoutParams(paramsRecyclerView);
                containerView.setLayoutParams(paramsContainerView);

                //show expand recylcerview list button
                ActionButton.setVisibility(View.VISIBLE);

            }
        }

        ....
    }
public class FirstPage extends Fragment {

public static final String ARG_ITEM_ID = "item_id";
...

public void onViewCreated(final View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

//      TODO: next & prev button
        TextView button_prev = (TextView) view.findViewById(R.id.btn_prev);
        TextView button_next = (TextView) view.findViewById(R.id.btn_nxt);
        PageTransition.pageContents(CaseContent.getSize(), getArguments().getString(ARG_ITEM_ID), button_next, button_prev);
        ....
    }

}

pageTransition.java

public class PageTransition {

    public static final String TAG = PageTransition.class.getSimpleName();

    //take number of pages
    public static void pageContents(int totalPage, String id, TextView next, TextView previous) {
        //change string string to int
        int pageID = Integer.parseInt(id);
        final int prevID, nextID; // id for next & prev page

        if(pageID == 1) {
            previous.setVisibility(View.GONE); //hide prev button onn 1st page

            prevID = 0;
            nextID = ++pageID;

            next.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    nextPage(nextID);
                }
            });

            Log.d(TAG, "pageContents: first page");

        } else if (pageID < totalPage - 1 && pageID !=1) {
            prevID = --pageID;
            nextID = 2+pageID;

            next.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    nextPage(nextID);
                }
            });

            previous.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    prevPage(prevID);
                }
            });


        } else if (pageID == totalPage) {
            next.setVisibility(View.GONE); //hide next button on last page

            prevID = --pageID;
            nextID = 0;

            previous.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    prevPage(prevID);
                }
            });
        }

    }

    private static void nextPage(int id) {

        Log.d(TAG, "nextPage: id " + id);

    }

    private static void prevPage(int id) {

        Log.d(TAG, "prevPage: id " + id);

    }
}

共有1个答案

盖玉石
2023-03-14

经过一些思考,我终于能把它算出来了。我必须将包含“Next”和“Prev”按钮的当前片段发送到类中。只有这样,我才能使用GetFragmentManager。我在firstpage.java中使用以下代码来设置“Next”和“Pre”按钮。

PageTransition.PageContents(this,CaseContent.getSize(),“Forma”,getArguments().getString(ARG_ITEM_ID),button_next,button_prev);

然后在item list上,每当使用单击其中一个item list菜单时,我都会添加这段代码

Fragment Fragment=pageTransition.init(id,“forma”);getSupportFragmentManager().BeginTransaction().Replace(r.id.case_detail_container,fragment).Commit();

pageTransition.java

public class PageTransition {

    public static final String TAG = PageTransition.class.getSimpleName();
    private static int pageId;

    public static Fragment init(String id, String form) {
        Log.d(TAG, "currentPage: id " + id);
        pageId = Integer.valueOf(id); //set current page Id

        switch(form) {
            case "formA" :
                return formA_caseContent(id);
            case "formB" :
                return formB_caseContent(id);
            case "formC" :
                return formC_caseContent(id);
            default:
                Log.d(TAG, "currentPage: form id " + form + " out of bound.");
                return null;
        }
    }

    public static void pageContents(final Fragment fragment, int totalPage, final String form, String id, TextView next,
                                    TextView previous) {
        //change string string to int
        int pageID = Integer.parseInt(id);
        int prevID = 0, nextID = 0;

        if(pageID == 1) {
            previous.setVisibility(View.GONE); //hide prev button onn 1st page
            nextID = ++pageID;

        } else if (pageID > 1 && pageID < totalPage ) {
            prevID = --pageID;
            nextID = 2+pageID;

        } else if (pageID == totalPage) {
            next.setVisibility(View.GONE); //hide next button on last page
            prevID = --pageID;

        }

        final int finalNextID = nextID;
        next.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Fragment _fragment = init(String.valueOf(finalNextID), form);
                    fragment.getFragmentManager().beginTransaction()
                            .replace(R.id.case_detail_container, _fragment).commit();
                }
            });

        final int finalPrevID = prevID;
        previous.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Fragment _fragment = init(String.valueOf(finalPrevID), form);
                    fragment.getFragmentManager().beginTransaction()
                            .replace(R.id.case_detail_container, _fragment).commit();
                }
            });

    }

    private static Fragment formA_caseContent(String id) {

        Bundle arguments = new Bundle();
        Fragment fragment;

        switch (id) {
            case "1":
                arguments.putString(FirstPage.ARG_ITEM_ID, id);
                fragment = new FirstPage();

                break;
            case"2":
                arguments.putString(SecondPage.ARG_ITEM_ID, id);
                fragment = new SecondPage();

                break;
            ....
            default:
                Log.i(TAG, "onSelectedMenuItem: Selection out of bound.");
                arguments.putString(FirstPage.ARG_ITEM_ID, id);
                fragment = new FirstPage();
                break;
        }

        fragment.setArguments(arguments);
        return fragment;
    }

    private static Fragment formB_caseContent(String id) {}

    private static Fragment formc_caseContent(String id) {}
}
 类似资料:
  • 我想写一个为我创建多个片段的方法,但我不知道如何做到这一点。几次尝试之后,我变得更加困惑。 这是我通常如何创建两个片段 创建片段的第二次调用 由于newInstance方法是静态的,我似乎不知道如何创建一个泛型方法并只传入类类型。另外,传入newInstance的对象并不总是数组。以下是我的尝试:

  • 我在一个片段中使用ListView,我已经按照Android的指示设置了所有必要的要求,下面是我的XML列表代码 在我的代码中 但是,我仍然得到这个错误 08-20 23:26:26.053:E/AndroidRuntime(30334):致命异常:main 08-20 23:206:26.053:E/Android Runtime“30334”:进程:com.deliveryscience.tr

  • 问题内容: 搜索后,我没有在网上或任何其他资源中找到任何东西,我想知道您是否可以通过联接另一个视图和一些其他表来形成一个视图?我猜类似的东西与Server_ref.part_notification_view是要加入的视图。 问题答案: 您当然可以在另一个视图的基础上建立一个视图: 但是您不能引用基础表中的任何内容,包括不属于视图的任何字段: 具有相同列的基础表不是问题,并且如果您在视图中包含的内

  • 此时,Frag2在堆栈上,是唯一可见的片段。我使用了replace和addToBackStack,因为我需要后退导航。我的问题是,当我在Frag2内旋转屏幕时,活动中的super.oncreate(savedInstanceState)方法调用frag1的构造函数。 在用户按下后退按钮之前,有没有什么方法可以避免调用Frag1的构造函数?

  • 我正在写一个使用片段的简单示例。在主体活动中,有两个片段。第一个片段有一些文本视图,第二个片段有一些按钮。当用户点击textview时,文本打开按钮将被更改。 activity_main.xml mainactivity.java contentFrag.java 我没有编写控制按钮的操作,只是生成onclick事件。但是,我弄错了。请帮助我修复错误,并继续完成我的任务。

  • 我有一个活动和两个片段。片断a和片断b。 我需要实现像,最初碎片应该在那里。在之后,单击FragmentB应该在那里。 我的第二段代码: