8

我设计了一个RelativeLayout。我正在尝试向其中添加片段。它重叠。我需要做什么才能使其低于其他。

    FragmentTransaction t = getSupportFragmentManager().beginTransaction();

    FragmentTest myFragment = new FragmentTest();
    t.add(layout.getId(), myFragment, "myFirstFragment");

    FragmentTest myFragment2 = new FragmentTest();
    t.add(layout.getId(), myFragment2, "mySecondFragment");

    t.commit();

//即使我将方向设置为垂直,myFragment 和 myFragment2 的视图也会重叠。

<RelativeLayout
    android:id="@+id/idll1"
    android:layout_width="fill_parent"
    android:layout_height="50dp"
    android:layout_marginLeft="10sp"
    android:layout_marginRight="0sp"
    android:layout_marginTop="10sp"
    android:layout_weight="1"
    android:paddingBottom="5dp"
    android:paddingLeft="10dp"
    android:paddingRight="5dp"
    android:paddingTop="5dp" 
    android:orientation="vertical"/>
4

4 回答 4

4

我们可以这样做:

存在相对布局的活动类。让该相对布局(mParentLayout)成为活动视图层次结构的根元素。并且要添加到相对布局的片段将是 mGridFragment,位于 Button (mGridBtn) 下方的位置。

public class DroidOpsActivity extends FragmentActivity implements
    OnClickListener {

    private RelativeLayout mParentLayout = null;
    private Button mGridBtn = null;
    private FragmentManager mFragmentMgr = null;
    private FragmentTransaction mFragmentTransc = null;
    private Fragment mGridFragment = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        initialize();
    }

    private void initialize() {
        setContentView(R.layout.activity_droid_ops);
        mParentLayout = (RelativeLayout) findViewById(R.id.parent_layout);
        mGridBtn = (Button) findViewById(R.id.grid_button);
        mFragmentMgr = getSupportFragmentManager();
        registerListener();
    }

    private void registerListener() {
        mGridBtn.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.grid_button:
                    loadFragment();
                    mGridBtn.setEnabled(false);
        break;
        }
    }

    private void loadFragment() {
        mGridFragment = new DroidOpsFragments();
        mFragmentTransc = mFragmentMgr.beginTransaction();
        mFragmentTransc.add(mParentLayout.getId(), mGridFragment);
        mFragmentTransc.addToBackStack(null);
        mFragmentTransc.commit();
    }

    public RelativeLayout.LayoutParams fetchLayoutParams() {
        RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(
                    LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);

        // We can add any rule available for RelativeLayout and hence can position accordingly
        params.addRule(RelativeLayout.BELOW, mGridBtn.getId());
        return params;
    }
}

相应的 Fragment 类,将在 Activity 的布局中定位。

public class DroidOpsFragments extends Fragment {

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

        // Here we are fetching the layoutParams from parent activity and setting it to the fragment's view.

        view.setLayoutParams(((DroidOpsActivity) activity).fetchLayoutParams());
        return view;
    }

}
于 2013-01-03T11:09:17.010 回答
1

您必须在 Fragment 的视图中设置布局 prarams。

它们是 XML 还是硬编码?

如果它们是硬编码的,您将必须使用向后兼容的支持库获取 Google 放置在所有片段视图上的 FrameLayout Wrapper,并在视图的 onlayout 或 onMeasure 中设置其相对布局参数。

否则,如果它们是 XML,则只需设置相关规则。

于 2012-11-24T18:03:34.283 回答
0

我认为应该是LinearLayout

于 2012-11-02T14:09:32.663 回答
0

Quick and Dirty 似乎要好一些。如果你已经知道你的布局,你可以节省一些步骤,而且我知道一个巨大的 if (X instanceof Class) 块集是不受欢迎的,它非常通用。

    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        ViewGroup.LayoutParams p = view.getLayoutParams();
        if (p instanceof CoordinatorLayout.LayoutParams) {
            CoordinatorLayout.LayoutParams params = ((CoordinatorLayout.LayoutParams)p);
            params.gravity = Gravity.END | Gravity.BOTTOM;
            view.setLayoutParams(params);
        }
        else if (p instanceof RelativeLayout.LayoutParams) {
            RelativeLayout.LayoutParams params = ((RelativeLayout.LayoutParams)p);
            params.addRule(RelativeLayout.ALIGN_BOTTOM);
            view.setLayoutParams(params);
        }
}
于 2016-07-06T15:55:33.587 回答