Это мой самый первый пост в StackOverflow. Этот сайт до сих пор был спасителем.
Я довольно новичок в этом, и до сих пор я был в состоянии решить свои проблемы, но я застрял в этой проблеме прямо здесь.
Я работаю внутри фрагмента (который я 'Я новичок в). Я пытаюсь надуть (который я не знаю много об этом) существующий контейнер внутри этого фрагмента, с целью. Я надеюсь, что я объясняю это правильно.
Контекст: я пытаюсь получить некоторые измерения (и другие переменные) от пользователя, чтобы вычислить площади стен, длины и т. Д. Пользователь сможет «Добавить стены» с помощью нажатия кнопки;который должен просто надуть из существующего макета.
Я пытался переместить код в разные жизненные циклы (onCreate
против 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;
}
}
Это место, где должна происходить инфляция: (часть большего макета с 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: указанный дочерний элемент уже имеет родителя. Сначала вы должны вызвать removeView () для родительского объекта ребенка.
Конечно, я не хочу удалять это представление, но хочу продолжать добавлять к нему. царапает голову
Я работал до того, как начал менять все на фрагменты. Это говорит мне о том, что это, вероятно, связано с тем фактом, что я сейчас внутри фрагмента.
Я провел весь день, пытаясь выяснить это. Я не уверен, что моя логика ошибочна, потому что я только начал работать с Фрагментами или это мое непонимание LayoutInflator
. Вероятно, оба. O: -)