Возможно ли, что я могу добавить представление фрагмента в представлении активности без указания компонента представления "фрагмент" в XML файле макета операции? Какую функцию я должен искать?
Как добавить фрагмент в Activity без контейнера
Ответ 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());
}