Как добавить фрагмент в Activity без контейнера

Возможно ли, что я могу добавить представление фрагмента в представлении активности без указания компонента представления "фрагмент" в XML файле макета операции? Какую функцию я должен искать?

Ответ 1

Ну, пользовательский интерфейс фрагмента должен куда-то уйти. Если вы хотите, чтобы весь "просмотр содержимого" был фрагментом, добавьте фрагмент в android.R.id.content:

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    if (getSupportFragmentManager().findFragmentById(android.R.id.content)==null) {
      getSupportFragmentManager().beginTransaction()
        .add(android.R.id.content, new ToDoRosterListFragment())
        .commit();
    }
  }

В противном случае, где-то в иерархии представлений активности, вам нужен контейнер (обычно a FrameLayout), в который помещается интерфейс фрагмента. Обычно мы делаем это, помещая контейнер в ресурс компоновки.

Ответ 2

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

        getSupportFragmentManager().beginTransaction()
            .add(android.R.id.content, MyFragment.newInstance())
            .commit();

   //Some your code here
}

android.R.id.content - это контейнер всего экрана приложения. Его можно использовать с фрагментом:

Значение android.R.id.content ID указывает на ViewGroup всей области содержимого Activity.

В приведенном выше коде будет вставлен вид, созданный фрагментом, в ViewGroup, идентифицированный андроидом .R.id.content.

Ответ 3

Вам нужно иметь макет в своей деятельности, чтобы содержать фрагмент (предпочтительно FrameLayout).

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/container"
android:name="com.gdevelopers.movies.movies.FragmentMoreMovies"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior" />

Затем в действие поместите этот код.

@Override
protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);

  getSupportFragmentManager().beginTransaction()
    .replace(R.id.container, new YourFragment())
    .commit();
  }
}

Ответ 4

Если вы не хотите идти с ответом @CommonsWare, вам придется предоставить контейнер по коду. то вам нужна функция....

setContentView(View)

Угу. Если вы проверите код класса активности, вы увидите, что setContentView можно вызвать с помощью INT (макеты идентифицированы с помощью int) или с помощью Views. Таким образом, вы можете создать экземпляр viewgroup на лету, сохранить ссылку на него (вам нужно будет сделать то же самое с созданным XML-представлением) и добавить туда свои фрагменты. Это возможно, потому что XML файлы - это просто аргументы, которые класс представления factory, Inflater, использует для определения того, какие подклассы представлений должны создавать, используя набор параметров, предоставленных в XML. И, очевидно, вы можете это сделать вручную. Просто выберите любой класс макета, который вы хотите использовать, например FrameLayout, и:

public class Activity extends AppCompatActivity{

private FrameLayout root;

@Override
public void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    root = new FrameLayout(this); 
 root.setLayoutParams(new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT));
    setContentView(root);
//go on
}

}

Ответ 5

Просто при создании фрагмента мы должны заменить или добавить фрагмент с представлением, представленным в нашем приложении. Чтобы заменить или добавить фрагмент, мы обычно добавляем Framelayout или любое другое представление макета (как контейнер фрагмента) в активности или в фрагменте.

Теперь, если вы хотите заменить или добавить представление фрагмента без добавления в свою активность дополнительного контейнера представления. Вы можете просто сделать это, обратившись к представлению, предоставленному AppCompatActivity или Activity.

Теперь вы можете создать фрагмент, не добавляя в свою активность контейнер представления, который вы можете создать как

YourFragment fragment = new YourFragment();
transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(android.R.id.content, fragment);  //here, android.R.id.content is a view on which your fragment view is replaced
transaction.commit();

Ответ 6

используйте контейнер для Android вместо пользовательского контейнера, например

fragmentTransaction.replace(android.R.id.content,yourFragment);

Ответ 7

1.use getWindow().getDecorView(), чтобы получить DecorView (FramLayout)
2.add вид контейнера на DecorView
3.add Fragment в представление контейнера

Ответ 8

LinearLayout llRoot = findViewById(R.id.parent);

FragmentManager fragMan = getSupportFragmentManager();
FragmentTransaction fragTransaction = fragMan.beginTransaction();
YourFragment yourFragment = (YourFragment)fragMan.findFragmentByTag("yourFragment");
if (yourFragment == null) {
  yourFragment = new YourFragment();
}
fragTransaction.replace(llRoot.getId(), yourFragment, "yourFragment");
fragTransaction.commit();

llRoot - это LinearLayout, который содержит другой объект просмотра вашей активности.

Ответ 9

Если вы не хотите выделять определенное место в представлении контейнера фрагментов, вы всегда можете использовать RelativeLayour. Я думаю, без контейнера мы не можем разместить фрагмент в представлении.

Ответ 10

Если у вас есть View или сказать корневой вид из окна активности, введите его идентификатор view.getId() (относящийся к android:id) и передайте этот идентификатор в fragmentTransaction.add() в качестве идентификатора контейнера. Вот только образец:

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    View view = new View(this);
    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    ft.add(view.getId(), new Fragment());
}