如何通过在 Fragment 中单击按钮多次膨胀 view/container?
How do I inflate a view/container multiple times by button click inside a Fragment?
这是我在 Whosebug 上的第一个 post。到目前为止,该站点一直是救星。
我对此很陌生,到目前为止,我已经能够解决我的问题,但我被困在这个问题上了。
我正在片段中工作(我是新手)。我正在尝试膨胀(我对此不太了解)这个片段中的现有容器,并带有一个视图。我希望我能正确解释这一点。
上下文:我正在尝试从用户那里获取一些测量值(和其他变量)来计算墙面积、长度等。用户应该能够通过单击按钮 "Add Walls";它应该只是从现有布局中膨胀。
我试过在不同的生命周期中移动代码(onCreate
vs onCreatedView
等)。我还尝试在 LayoutInflator
中传递不同的参数(父视图,将 attachToRoot 设置为 false、true 等)
CalculatorActivity.java
public class CalculatorActivity extends AppCompatActivity {
//...
private FragmentNewCalc fragmentNewCalc;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_calculator);
fragmentNewCalc = new FragmentNewCalc();
//Replace Containers
getSupportFragmentManager().beginTransaction()
.replace(R.id.container_wrap, fragmentNewCalc)
.commit();
}
}
这会膨胀 XML ->
<FrameLayout
android:id="@+id/container_wrap"
android:layout_width="match_parent"
android:layout_height="match_parent" />
FragmentNewCalc.java
LinearLayout wallContainer;
LinearLayout test; //testing with LinearLayout
CardView newWallCard; //this is what I want to use though
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.frag_new_calc, container, false);
wallContainer = (LinearLayout) v.findViewById(R.id.new_wall_container);
//LayoutInflater inflater2; //testing
//inflater2 = getLayoutInflater();
//newWallCard = (CardView) inflater.inflate(R.layout.frag_new_walls, container, false);
test = (LinearLayout) inflater.inflate(R.layout.wall_add_section, null); //tested this wallContainer as parent view and true/false
fab_add_wall = (FloatingActionButton) v.findViewById(R.id.fab_add_wall);
fab_add_wall.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
wallContainer.addView(test);
}
});
return v;
}
}
这是 inflation 应该出现的地方:(具有 CoordinatorLayout、Scrollview 等的更大布局的一部分)
<LinearLayout
android:id="@+id/new_wall_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
我第一次点击按钮时,用户界面成功添加了膨胀布局(按预期工作),但连续点击后,出现错误:
java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
我当然不想删除该视图,但想继续添加它。 挠头
在开始将所有内容更改为 Fragments 之前,我已经完成了这项工作。所以这告诉我,这可能与我现在在片段中的事实有关。
我花了一整天的时间试图解决这个问题。我不确定我的逻辑是否有缺陷,因为我刚开始使用 Fragments 还是我对 LayoutInflator
缺乏理解。可能两者都有。 O:-)
在您的 onClick 中,请膨胀视图
public void onClick(View v) {
inflater.inflate(R.layout.wall_add_section, wallContainer, true);
}
这是我在 Whosebug 上的第一个 post。到目前为止,该站点一直是救星。
我对此很陌生,到目前为止,我已经能够解决我的问题,但我被困在这个问题上了。
我正在片段中工作(我是新手)。我正在尝试膨胀(我对此不太了解)这个片段中的现有容器,并带有一个视图。我希望我能正确解释这一点。
上下文:我正在尝试从用户那里获取一些测量值(和其他变量)来计算墙面积、长度等。用户应该能够通过单击按钮 "Add Walls";它应该只是从现有布局中膨胀。
我试过在不同的生命周期中移动代码(onCreate
vs onCreatedView
等)。我还尝试在 LayoutInflator
中传递不同的参数(父视图,将 attachToRoot 设置为 false、true 等)
CalculatorActivity.java
public class CalculatorActivity extends AppCompatActivity {
//...
private FragmentNewCalc fragmentNewCalc;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_calculator);
fragmentNewCalc = new FragmentNewCalc();
//Replace Containers
getSupportFragmentManager().beginTransaction()
.replace(R.id.container_wrap, fragmentNewCalc)
.commit();
}
}
这会膨胀 XML ->
<FrameLayout
android:id="@+id/container_wrap"
android:layout_width="match_parent"
android:layout_height="match_parent" />
FragmentNewCalc.java
LinearLayout wallContainer;
LinearLayout test; //testing with LinearLayout
CardView newWallCard; //this is what I want to use though
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.frag_new_calc, container, false);
wallContainer = (LinearLayout) v.findViewById(R.id.new_wall_container);
//LayoutInflater inflater2; //testing
//inflater2 = getLayoutInflater();
//newWallCard = (CardView) inflater.inflate(R.layout.frag_new_walls, container, false);
test = (LinearLayout) inflater.inflate(R.layout.wall_add_section, null); //tested this wallContainer as parent view and true/false
fab_add_wall = (FloatingActionButton) v.findViewById(R.id.fab_add_wall);
fab_add_wall.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
wallContainer.addView(test);
}
});
return v;
}
}
这是 inflation 应该出现的地方:(具有 CoordinatorLayout、Scrollview 等的更大布局的一部分)
<LinearLayout
android:id="@+id/new_wall_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
我第一次点击按钮时,用户界面成功添加了膨胀布局(按预期工作),但连续点击后,出现错误:
java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
我当然不想删除该视图,但想继续添加它。 挠头
在开始将所有内容更改为 Fragments 之前,我已经完成了这项工作。所以这告诉我,这可能与我现在在片段中的事实有关。
我花了一整天的时间试图解决这个问题。我不确定我的逻辑是否有缺陷,因为我刚开始使用 Fragments 还是我对 LayoutInflator
缺乏理解。可能两者都有。 O:-)
在您的 onClick 中,请膨胀视图
public void onClick(View v) {
inflater.inflate(R.layout.wall_add_section, wallContainer, true);
}