添加视图到布局?

时间:2013-12-26 22:29:14

标签: android android-layout android-fragments

假设我的ActivityView / ViewGroupButton组成,占据了100%的空间。现在,通过按Button,我想添加View / ViewGroup,这样两个项目占据屏幕的50%(依此类推)。我以为我可以使用FragmentTransactions(因为那时我最终可能会学习如何使添加新视图的效果看起来很好),因此FrameLayout然后添加Fragments解决方案,但显然每Fragment只能添加一个FrameLayout

编辑:这是我到目前为止所拥有的。请记住,这只是一个示例,我想最终添加更复杂的视图(以考虑布局更改):

MainActivity.java

public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        FragmentManager fm = getFragmentManager();
        FragmentTransaction fragTrans = fm.beginTransaction();
        fragTrans.add(R.id.Frame1, new AddFragFrag());
        fragTrans.commit();
    }

}

activity_main.xml:(在垂直方向的LinearLayout中)

<FrameLayout
    android:id="@+id/Frame1"
    android:layout_width="fill_parent"
    android:layout_height="0dp"
    android:layout_weight="1"/>

<FrameLayout
    android:id="@+id/Frame2"
    android:layout_width="fill_parent"
    android:layout_height="0dp"
    android:layout_weight="1"/>

AddFragFrag.java

public class AddFragFrag extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
        View view = inflater.inflate(R.layout.addfragfrag, container, false);

        Button addFragButton = (Button)view.findViewById(R.id.addFragmentButton);
        addFragButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Log.d("addFragFrag.java", "Adding new Fragment...");
            FragmentManager fm = getFragmentManager();
            FragmentTransaction fragTrans = fm.beginTransaction();
            fragTrans.add(R.id.Frame2, new But2());
            fragTrans.commit();
        }
    });
    return view;
}

}

addfragfrag.xml (也在LinearLayout中)

<Button android:id="@+id/addFragmentButton"
        android:layout_height="0dp"
        android:layout_width="fill_parent"
        android:layout_weight="1"
        android:text="Add Button Fragment"/>

<!--  more stuff here later -->

这里可视化我想要的东西:

------------------
| -------------- |
| |            | |
| |            | |
| |            | |
| | ViewGroup1 | |
| |            | |
| |            | |
| |            | |
| |            | |
| -------------- |
------------------

       ==>  (by pressing a button, layout, event, ...)

------------------
| -------------- |
| |            | |
| | ViewGroup1 | |
| |            | |
| -------------- |
| -------------- |
| |            | |
| | ViewGroup2 | |
| |            | |
| -------------- |
------------------

3 个答案:

答案 0 :(得分:0)

如果您尝试添加一个简单的Button,则不需要为此实现整个Fragment,而且,您只能向FrameLayout添加一个片段(据我所知)

所以要添加按钮并为所有按钮提供相同的空间,您必须将每个按钮的weight设置为1

答案 1 :(得分:0)

您可以使用LinearLayout并为每个按钮赋予相同的权重。

答案 2 :(得分:0)

我终于明白了!事实证明,这个问题还有很多方面我还没有掌握(可能还是没有完全理解)。

一个问题是我无法将Views / ViewGroups从100%提高到50%(反之亦然)。这可以通过将可见性设置为GONE或VISIBLE来解决,如下所示:

FrameLayout hideFL = (FrameLayout)findViewById(R.id.Frame1);
hideFL.setVisibility(View.GONE);

第二个问题是我无法正确引用各种Views / ViewGroups(例如,通过使用 findViewById(...)),特别是如果它们被Fragment夸大了。虽然我仍然对Activity的 onCreate(...)和Fragment的 onCreateView(...)感到困惑,但我确实意识到 onCreateView onCreate 之后,我可以在完全“加载”后查看Views / ViewGroups。所以我将操作它们的代码移动到 onStart()方法。我不确定这是否是推荐的方法,但它确实帮助了我遇到的很多问题。

最后但同样重要的是,还有在片段中使用第二个Button的代码的问题(_AddFragFrag.java)。事实证明你不应该这样做,所以我完全删除了那部分。显然你应该实现一个接口,我在这里找到了一个很好的教程: Using Fragments in Android - A Worked Example

所以这里是修改后的代码,它首先完成了我想要的操作(请注意,这在将Fragments添加到FrameLayouts以外的其他内容时也有效,这是我遇到的另一个问题):

<强> MainActivity.java

public class MainActivity extends Activity implements AddFragFrag.OnButtonClickedListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        FrameLayout hideFL = (FrameLayout)findViewById(R.id.Frame1);
        hideFL.setVisibility(View.GONE);
    }

    @Override
    public void onStart() {
        super.onStart();

        Button addFragButton = (Button)findViewById(R.id.addFragmentButton);
        addFragButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Log.d("addFragFrag.java", "Adding new Fragment...");
            FrameLayout remFL = (FrameLayout)findViewById(R.id.Frame1);
            remFL.setVisibility(View.VISIBLE);

            FragmentManager fm = getFragmentManager();
            FragmentTransaction fragTrans = fm.beginTransaction();
            fragTrans.add(R.id.Frame1, new AddFragFrag());
            fragTrans.commit();
        }
       });
    }

    @Override
    public void onButtonClick(String s)
    {
        Toast.makeText(getApplicationContext(), "You clicked a button! Yeah!", Toast.LENGTH_SHORT).show();
    }
}

activity_main.xml (同样,在LinearLayout内)

<Button
    android:id="@+id/addFragmentButton"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:layout_weight="1"
    android:text="Add 2nd Button" 
/>

<FrameLayout
    android:id="@+id/Frame1"
    android:layout_width="fill_parent"
    android:layout_height="0dp"
    android:layout_weight="1"/>