Как несколько раз надуть представление / контейнер нажатием кнопки внутри фрагмента? - PullRequest
2 голосов
/ 08 октября 2019

Это мой самый первый пост в 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: -)

1 Ответ

1 голос
/ 08 октября 2019

Внутри вашего клика, пожалуйста, надуйте взгляд

public void onClick(View v) { 

    inflater.inflate(R.layout.wall_add_section, wallContainer, true);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...