目前,我正在使用以下代码添加片段。
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;
}
但是,如何添加自定义尺寸(高度,宽度和边距)的片段,而不是添加然后调整大小?
答案 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
属性进行操作,使其左右,顶部,底部,中心,底部中心,顶部中心等等
我在示例中使用的完整代码
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
,并让片段占用所有可用空间。