Котлин. Возможно лы перейти с Activity в Fragment(без добавления в activity через (.add) как в коде)
Есть код
LoginPage
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.View
import android.widget.Button
import android.widget.LinearLayout
import androidx.fragment.app.Fragment
import com.example.hospital.Fragments.HomeFragment
class LoginPage : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_login_page)
val button1 : LinearLayout = findViewById(R.id.LinearFragment_Container)
val ButtonOpen : Button = findViewById(R.id.btnLogin)
ButtonOpen.setOnClickListener {
val homeFragment = HomeFragment()
val fragment : Fragment?=
supportFragmentManager.findFragmentByTag(HomeFragment::class.java.simpleName)
if (fragment !is HomeFragment){
supportFragmentManager.beginTransaction()
.add(R.id.btnLoginForm, homeFragment,HomeFragment::class.java.simpleName)
.commit()
}
button1.visibility = View.GONE
}
}
}
И вот что получается:

За фрагменты отвечает MainActivity
А Я хотел чтобы fragment открывался в отдельном окне (то есть так):

Ответы (2 шт):
первый вариант, который пришел в голову это задать background вашему фрагменту, тогда фон не будет прозрачным Второй вариант это внутри активити сделать контейнер для фрагмента
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/container"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<!-- TODO: Update blank fragment layout -->
<androidx.fragment.app.FragmentContainerView
android:id="@+id/fragment_container"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</androidx.constraintlayout.widget.ConstraintLayout>
И в активити в качестве контейнера для фрагмента указывать FragmentContainerView
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val homeFragment = HomeFragment()
supportFragmentManager.beginTransaction()
.add(R.id.fragment_container, homeFragment,HomeFragment::class.java.simpleName)
.commit()
}
Вы вызываете add. и просто кладете наверх новый фрагмент, можно делать replace тогда фрагменты будут заменятся, но это привнесет тоже некоторые нюансы связанные с жизненным циклом.
Второй вариант просто добавить как уже написали выше белый фон фрагменту который сверху. Но и тут надо понимать что активными будут они одновременно и будут нюансы с жизненным циклом.
Более правильный варик - ативити юзать сугубо как контейнер. На сарте запихивать первый фрагмент и потом просто делать реплейс.
В активити только FragmentContainerView больше там ничего не нужно
<?xml version="1.0" encoding="utf-8"?>
<androidx.fragment.app.FragmentContainerView
android:id="@+id/fragment_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
на старте активити проверяете что то типа if savedInstanceState != null и кладете первый фрагмент, дальше вся движуха в нем. Активити только как контейнер