Android - 添加自定义尺寸的片段

时间:2016-06-29 08:45:50

标签: android android-fragments

目前,我正在使用以下代码添加片段。

private void addFragment(Fragment fragment, String fragmentName) {
    Log.i("Adder", "Adding fragment " + fragmentName);
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    fragmentTransaction.add(R.id.fragment_container, fragment, fragmentName);
    fragmentTransaction.commit();
}

以下代码用于调整添加的片段的大小。

private boolean readjustFragment(Fragment fragmentToBeAdjusted, FragmentCoordinates fragmentCoordinates) {
    if (fragmentToBeAdjusted != null) {
        View view = fragmentToBeAdjusted.getView();
        RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(fragmentCoordinates.getWidth(), fragmentCoordinates.getHeight());
        params.leftMargin = fragmentCoordinates.getX0();
        params.bottomMargin = fragmentCoordinates.getY0();
        view.setLayoutParams(params);
        view.requestLayout();
        return true;
    }
    return false;
}

但是,如何添加自定义尺寸(高度,宽度和边距)的片段,而不是添加然后调整大小?

5 个答案:

答案 0 :(得分:6)

您可以将所需的宽度高度和边距传递给片段,并在充气视图时指定该值

例如,如果您使用Frame布局作为片段的容器,则使用新的实例方法

传递值
/**
         * 
         * @param widthInDP
         * @param heightinDP
         * @param leftMarginDp
         * @param topMarginDp
         * @param rightMarginDp
         * @param bottomMarginDp
         * @param fragIndex
         * @return
         */
        public static PlaceholderFragment newInstance(int widthInDP,
                int heightinDP, int leftMarginDp, int topMarginDp,
                int rightMarginDp, int bottomMarginDp, int fragIndex) {
            PlaceholderFragment resizableFragment = new PlaceholderFragment();

            Bundle args = new Bundle();

            // Test purpose Only
            args.putInt(INDEX, fragIndex);

            // Set Width Height dynamically
            args.putInt(WIDTH, widthInDP);
            args.putInt(HEIGHT, heightinDP);

            // SetMargin
            args.putInt(LEFT_MARGIN, leftMarginDp);
            args.putInt(RIGHT_MARGIN, rightMarginDp);
            args.putInt(TOP_MARGIN, topMarginDp);
            args.putInt(BOTTOM_MARGIN, bottomMarginDp);
            resizableFragment.setArguments(args);

            return resizableFragment;
        }

然后在onCreateView方法中应用它们。如果你使用Frame布局作为片段的容器,那么请注意这里使用FrameLayout param,否则你将获得异常。

   FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) rootView
            .getLayoutParams();

    // set width height
    params.height = dpToPx(getArguments().getInt(HEIGHT));
    params.width = dpToPx(getArguments().getInt(WIDTH));

    // substitute
    // parameters for left,top, right, bottom
    params.setMargins(dpToPx(getArguments().getInt(LEFT_MARGIN)),
            dpToPx(getArguments().getInt(TOP_MARGIN)),
            dpToPx(getArguments().getInt(RIGHT_MARGIN)),
            dpToPx(getArguments().getInt(BOTTOM_MARGIN)));
    rootView.setLayoutParams(params);  

输出: -

橙色背景是我的Frame layout容器,所有其他容器都调整为Fragments,并在同一容器中使用自定义边距。您还可以使用LayoutParam.Gravity属性进行操作,使其左右,顶部,底部,中心,底部中心,顶部中心等等

enter image description here

我在示例中使用的完整代码

package com.example.fragment;

    import android.annotation.TargetApi;
    import android.graphics.Color;
    import android.os.Build;
    import android.os.Bundle;
    import android.support.v4.app.Fragment;
    import android.support.v4.app.FragmentActivity;
    import android.util.DisplayMetrics;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.FrameLayout;
    import android.widget.TextView;

    public class MainActivity extends FragmentActivity {

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            if (savedInstanceState == null) {
                getSupportFragmentManager()
                        .beginTransaction()
                        .add(R.id.container,
                                PlaceholderFragment.newInstance(400, 400, 50, 50,
                                        50, 50, 1)).commit();

                getSupportFragmentManager()
                        .beginTransaction()
                        .add(R.id.container,
                                PlaceholderFragment.newInstance(300, 300, 30, 30,
                                        30, 30, 2)).commit();

                getSupportFragmentManager()
                        .beginTransaction()
                        .add(R.id.container,
                                PlaceholderFragment.newInstance(200, 200, 20, 20,
                                        20, 20, 3)).commit();

                getSupportFragmentManager()
                        .beginTransaction()
                        .add(R.id.container,
                                PlaceholderFragment.newInstance(100, 100, 10, 10,
                                        10, 10, 4)).commit();
            }
        }

        /**
         * A placeholder fragment containing a simple view.
         */
        @TargetApi(Build.VERSION_CODES.HONEYCOMB)
        public static class PlaceholderFragment extends Fragment {

            private static final String HEIGHT = "Height";
            private static final String WIDTH = "Width";
            private static final String LEFT_MARGIN = "left";
            private static final String RIGHT_MARGIN = "right";
            private static final String TOP_MARGIN = "top";
            private static final String BOTTOM_MARGIN = "bottom";

            // Test Data
            private static final String INDEX = "FragNumber";

            /**
             * 
             * @param widthInDP
             * @param heightinDP
             * @param leftMarginDp
             * @param topMarginDp
             * @param rightMarginDp
             * @param bottomMarginDp
             * @param fragIndex
             * @return
             */
            public static PlaceholderFragment newInstance(int widthInDP,
                    int heightinDP, int leftMarginDp, int topMarginDp,
                    int rightMarginDp, int bottomMarginDp, int fragIndex) {
                PlaceholderFragment resizableFragment = new PlaceholderFragment();

                Bundle args = new Bundle();

                // Test purpose Only
                args.putInt(INDEX, fragIndex);

                // Set Width Height dynamically
                args.putInt(WIDTH, widthInDP);
                args.putInt(HEIGHT, heightinDP);

                // SetMargin
                args.putInt(LEFT_MARGIN, leftMarginDp);
                args.putInt(RIGHT_MARGIN, rightMarginDp);
                args.putInt(TOP_MARGIN, topMarginDp);
                args.putInt(BOTTOM_MARGIN, bottomMarginDp);
                resizableFragment.setArguments(args);

                return resizableFragment;
            }

            public PlaceholderFragment() {
            }

            public int dpToPx(int dp) {
                DisplayMetrics displayMetrics = getActivity().getResources()
                        .getDisplayMetrics();
                int px = Math.round(dp
                        * (displayMetrics.xdpi / DisplayMetrics.DENSITY_DEFAULT));
                return px;
            }

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

                View rootView = inflater.inflate(R.layout.fragment_main, container,
                        false);

                FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) rootView
                        .getLayoutParams();

                // set width height
                params.height = dpToPx(getArguments().getInt(HEIGHT));
                params.width = dpToPx(getArguments().getInt(WIDTH));

                // substitute
                // parameters for left,top, right, bottom
                params.setMargins(dpToPx(getArguments().getInt(LEFT_MARGIN)),
                        dpToPx(getArguments().getInt(TOP_MARGIN)),
                        dpToPx(getArguments().getInt(RIGHT_MARGIN)),
                        dpToPx(getArguments().getInt(BOTTOM_MARGIN)));
                rootView.setLayoutParams(params);

                // Test purpose Only
                switch (getArguments().getInt(INDEX)) {
                case 1:
                    rootView.setBackgroundColor(Color.MAGENTA);

                    ((TextView) rootView.findViewById(R.id.frag_index))
                            .setText("Fragment # " + getArguments().getInt(INDEX));

                    break;

                case 2:
                    rootView.setBackgroundColor(Color.GREEN);

                    ((TextView) rootView.findViewById(R.id.frag_index))
                            .setText("Fragment # " + getArguments().getInt(INDEX));

                    break;

                case 3:
                    rootView.setBackgroundColor(Color.BLUE);

                    ((TextView) rootView.findViewById(R.id.frag_index))
                            .setText("Fragment # " + getArguments().getInt(INDEX));

                    break;

                default:
                    rootView.setBackgroundColor(Color.WHITE);

                    ((TextView) rootView.findViewById(R.id.frag_index))
                            .setText("Fragment # " + getArguments().getInt(INDEX));

                    break;
                }

                return rootView;
            }
        }
    }

从技术上讲,这是可行的,但我不明白你为什么要这样做?

答案 1 :(得分:2)

你可以通过在片段的onCreateView中指定LayoutParams来实现,就像这样 -

user=> (defn single-elem? [s]
  #_=>   (and
  #_=>     (seq s)
  #_=>     (empty? (rest s))))
#'user/single-elem?

user=> (single-elem? [1])
true
user=> (single-elem? [1 2])
false
user=> (single-elem? [])
nil
user=> (single-elem? {:foo :bar})
true
user=> (single-elem? {:foo :bar :fez 42})
false

答案 2 :(得分:2)

Just add it with framelayout in your mainActvity and add your fragment like this: 

        <FrameLayout
            android:id="@+id/playfragment"
            android:layout_width="match_parent"
            android:layout_height="30dp" />


 FragmentPlay frg2 = new FragmentPlay();//create the fragment instance for the top fragment
        FragmentManager manager = getSupportFragmentManager();//create an instance of fragment manager
        FragmentTransaction transaction = manager.beginTransaction();//create an instance of Fragment-transaction
        transaction.add(R.id.playfragment, frg2, "Frag_Top_tag");
        transaction.commit();

答案 3 :(得分:1)

为什么不尝试制作自己的ViewGroup? ViewGroup负责调整onLayout()中的子位置及其在onMeasure()中的大小。只需扩展所需的viewgroup并使用您想要的逻辑和约束覆盖方法。

答案 4 :(得分:-1)

您可以在容器视图中设置尺寸,R.id.fragment_container,并让片段占用所有可用空间。