假设我的Activity
由View
/ ViewGroup
和Button
组成,占据了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 | |
| | | |
| -------------- |
------------------
答案 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"/>