如何从同一片段中的关闭按钮关闭片段?
Posted
技术标签:
【中文标题】如何从同一片段中的关闭按钮关闭片段?【英文标题】:How can i close a Fragment, from a close button in the same fragment? 【发布时间】:2021-10-28 19:54:32 【问题描述】:我是 android Studio 和一般编程的新手,我正在尝试制作一个应用程序,在该应用程序中,我从一个 Activity 调用一个片段(使屏幕上的部分信息随着 View.GONE 属性消失,并在同时使其显示将包含我的 Fragment 的 FrameLayout)。问题是这样做时,在我尝试调用的片段内部,有一个按钮可以关闭 tath 片段并返回到上一个活动,但是当我单击该按钮时,它会将我返回到 MainActivity,而不是我之前的 Activity点击按钮,我的错误是什么?我附上代码和 gif 以便您可以看到我做错了什么,我会感谢您的帮助(顺便说一下,英语不是我的母语,所以如果这个解释写得不好,我表示歉意)
带有视觉解释的 Gif:
https://s9.gifyu.com/images/gif_explanation.gif
我在 DatosPokemonActivity 中的代码(注意按钮中的函数也调用了 PokeAPi,但我认为这不是问题)
package com.example.pokedexv4
import android.app.Activity
import android.content.Intent
import android.content.pm.PackageManager
import android.media.MediaPlayer
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.view.View
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
import androidx.core.view.isVisible
import com.example.pokedexv4.APIConexion.Retrofit
import com.example.pokedexv4.databinding.ActivityDatosPokemonBinding
import com.example.pokedexv4.datosdeAPI.Ability
import com.example.pokedexv4.datosdeAPI.PokemonEsqueleto
import com.example.pokedexv4.datosdeAPI2.FlavorTextEntry
import com.example.pokedexv4.datosdeAPI2.PokemonDescripcion
import com.squareup.picasso.Picasso
import kotlinx.android.synthetic.main.activity_datos_pokemon.*
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import java.lang.NullPointerException
class DatosPokemonActivity : AppCompatActivity()
private lateinit var binding: ActivityDatosPokemonBinding
override fun onCreate(savedInstanceState: Bundle?)
super.onCreate(savedInstanceState)
binding = ActivityDatosPokemonBinding.inflate(layoutInflater)
setContentView(binding.root)
supportActionBar?.hide()
datospkm()
normalOshiny()
visualizador()
pidePermiso()
cambiostatFragment(posicion)
fun cambioStatFragment(position: String)
val statsFragment = StatsFragment()
binding.STATS.setOnClickListener
pantallaDatos.visibility = View.GONE
frameFragments.isVisible = true
CoroutineScope(Dispatchers.IO).launch
val respuesta =
Retrofit.getRetrofit.pokemonesPokedex("$position") //position en la lista
if (respuesta.isSuccessful)
runOnUiThread
val estadisticas = respuesta.body()!!
val hp = estadisticas.stats[0].base_stat
val atk = estadisticas.stats[1].base_stat
val def = estadisticas.stats[2].base_stat
val spatk = estadisticas.stats[3].base_stat
val spdef = estadisticas.stats[4].base_stat
val spd = estadisticas.stats[5].base_stat
var datos: Bundle = Bundle()
datos.putString("pasarhp", hp.toString())
datos.putString("pasaratk", atk.toString())
datos.putString("pasardef", def.toString())
datos.putString("pasarspatk", spatk.toString())
datos.putString("pasarspdef", spdef.toString())
datos.putString("pasarspd", spd.toString())
statsFragment.arguments = datos
supportFragmentManager.beginTransaction().apply
replace(R.id.frameFragments, statsFragment)
addToBackStack("grafico") //<--?
commit()
我在 StatsFragment 中的代码
package com.example.pokedexv4
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.appcompat.app.AppCompatActivity
import androidx.core.content.ContextCompat
import androidx.core.view.isVisible
import androidx.fragment.app.Fragment
import com.example.pokedexv4.databinding.FragmentStatsBinding
import com.github.mikephil.charting.data.RadarData
import com.github.mikephil.charting.data.RadarDataSet
import com.github.mikephil.charting.data.RadarEntry
import com.github.mikephil.charting.interfaces.datasets.IRadarDataSet
import kotlinx.android.synthetic.main.activity_datos_pokemon.*
class StatsFragment : Fragment(R.layout.fragment_stats)
private var _binding: FragmentStatsBinding? = null
private val binding get() = _binding!!
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View?
_binding = FragmentStatsBinding.inflate(inflater, container, false)
cerrarGrafico()
return binding.root
fun cerrarGrafico()
binding.btnCerrar.setOnClickListener
frameFragments!!.visibility = View.GONE
pantallaDatos.isVisible = true
val activity = view?.context as AppCompatActivity
activity.supportFragmentManager?.beginTransaction()?.hide(this)?.commit()
我认为这是解释我的问题的最佳方式,如果需要,请随时询问更多信息,谢谢 :D !!!
编辑:根据要求,这里是 StatsFragment 和 DatosPokemonActivity 的 .xml 代码
.xml DatosPokemonActivity
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_
android:layout_
android:background="@drawable/fondoinfopkmynavegador"
tools:context=".DatosPokemonActivity"
android:orientation="vertical">
<FrameLayout
android:id="@+id/frameFragments"
android:layout_
android:layout_
android:layout_marginTop="143.4dp"
android:layout_marginStart="40.8dp"
android:layout_marginEnd="40.8dp"
android:layout_marginBottom="18dp"
android:visibility="gone">
</FrameLayout>
<LinearLayout
android:id="@+id/pantallaDatos"
android:layout_
android:layout_
android:layout_marginStart="42dp"
android:layout_marginTop="145dp"
android:layout_marginEnd="42dp"
android:orientation="vertical">
<LinearLayout
android:layout_
android:layout_
android:orientation="horizontal">
<LinearLayout
android:layout_
android:layout_
android:orientation="vertical">
<LinearLayout
android:layout_
android:layout_
android:orientation="horizontal">
<ImageView
android:id="@+id/imgpkm"
android:layout_
android:layout_
android:contentDescription="@string/contentDescrip"
tools:src="@mipmap/pkm001" />
<ImageView
android:id="@+id/imgpkmshiny"
android:layout_
android:layout_
android:contentDescription="@string/contentDescrip"
android:visibility="gone"
tools:src="@mipmap/pkm002" />
<LinearLayout
android:layout_
android:layout_
android:orientation="vertical">
<ImageButton
android:id="@+id/btnNormalVersion"
android:layout_
android:layout_
android:layout_marginTop="5dp"
android:background="@null"
android:contentDescription="@string/contentDescrip"
android:scaleType="fitCenter"
android:src="@drawable/normalpokemon"
tools:ignore="TouchTargetSizeCheck,ImageContrastCheck,SpeakableTextPresentCheck,DuplicateSpeakableTextCheck" />
<ImageButton
android:id="@+id/btnShinyVersion"
android:layout_
android:layout_
android:layout_marginTop="135dp"
android:background="@null"
android:contentDescription="@string/contentDescrip"
android:scaleType="fitCenter"
android:src="@drawable/destelloshiny"
tools:ignore="TouchTargetSizeCheck,SpeakableTextPresentCheck,ImageContrastCheck" />
</LinearLayout>
</LinearLayout>
<LinearLayout
android:layout_
android:layout_
android:orientation="horizontal">
<LinearLayout
android:layout_
android:layout_
android:orientation="vertical">
<ImageView
android:layout_
android:layout_
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:contentDescription="@string/contentDescrip"
android:src="@drawable/ic_baseline_height_24" />
<ImageView
android:layout_
android:layout_
android:layout_marginStart="8dp"
android:layout_marginTop="2dp"
android:contentDescription="@string/contentDescrip"
android:src="@drawable/peso" />
</LinearLayout>
<LinearLayout
android:layout_
android:layout_
android:orientation="vertical">
<TextView
android:id="@+id/altura"
android:layout_
android:layout_
android:layout_marginTop="3dp"
android:gravity="end"
android:textSize="20sp"
android:textStyle="bold"
tools:text="0.7" />
<TextView
android:id="@+id/peso"
android:layout_
android:layout_
android:layout_marginTop="1dp"
android:gravity="end"
android:textSize="20sp"
android:textStyle="bold"
tools:text="0.5" />
</LinearLayout>
<LinearLayout
android:layout_
android:layout_
android:orientation="vertical">
<TextView
android:id="@+id/metros"
android:layout_
android:layout_
android:layout_marginStart="5dp"
android:layout_marginTop="3dp"
android:text="@string/metros"
android:textSize="20sp"
android:textStyle="bold" />
<TextView
android:id="@+id/kilo"
android:layout_
android:layout_
android:layout_marginStart="5dp"
android:layout_marginTop="1dp"
android:text="@string/kilos"
android:textSize="20sp"
android:textStyle="bold" />
</LinearLayout>
<LinearLayout
android:layout_
android:layout_
android:layout_marginTop="1dp"
android:orientation="horizontal">
<ImageView
android:id="@+id/tipodato"
android:layout_
android:layout_
android:layout_marginStart="10dp"
android:layout_marginTop="10dp"
android:contentDescription="@string/contentDescrip"
tools:src="@mipmap/tipoplanta" />
<ImageView
android:id="@+id/tipo2dato"
android:layout_
android:layout_
android:layout_marginStart="8dp"
android:layout_marginTop="10dp"
android:contentDescription="@string/contentDescrip"
tools:src="@mipmap/tipoveneno" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
android:layout_
android:layout_
android:orientation="vertical"
<LinearLayout
android:layout_
android:layout_
android:orientation="vertical">
<TextView
android:layout_
android:layout_
android:layout_marginStart="8dp"
android:layout_marginTop="2dp"
android:text="@string/nombre"
android:textSize="15sp"
android:textStyle="bold" />
<TextView
android:id="@+id/nombredato"
android:layout_
android:layout_
android:layout_marginStart="8dp"
android:gravity="end"
android:paddingEnd="5dp"
android:textSize="18sp"
android:textStyle="bold"
tools:text="Bulbasaur" />
<TextView
android:layout_
android:layout_
android:layout_marginStart="8dp"
android:layout_marginTop="7dp"
android:paddingEnd="5dp"
android:text="@string/hab"
android:textSize="15sp"
android:textStyle="bold" />
<TextView
android:id="@+id/habilidad"
android:layout_
android:layout_
android:layout_marginStart="8dp"
android:autoSizeTextType="uniform"
android:gravity="end"
android:paddingEnd="5dp"
android:textSize="17sp"
android:textStyle="bold"
tools:text="Espesura" />
<TextView
android:id="@+id/habilidad2"
android:layout_
android:layout_
android:layout_marginStart="8dp"
android:autoSizeTextType="uniform"
android:gravity="end"
android:paddingEnd="5dp"
android:textSize="17sp"
android:textStyle="bold"
tools:text="Espesura" />
<TextView
android:layout_
android:layout_
android:layout_marginStart="8dp"
android:paddingEnd="5dp"
android:text="@string/haboculta"
android:textSize="15sp"
android:textStyle="bold" />
<TextView
android:id="@+id/habilidadoculta"
android:layout_
android:layout_
android:layout_marginStart="8dp"
android:gravity="end"
android:paddingEnd="5dp"
android:textSize="17sp"
android:textStyle="bold"
tools:text="Clorofila" />
<TextView
android:layout_
android:layout_
android:layout_marginStart="8dp"
android:layout_marginTop="7dp"
android:paddingEnd="5dp"
android:text="@string/gruphuevo"
android:textSize="15sp"
android:textStyle="bold" />
<TextView
android:id="@+id/grupohuevo1"
android:layout_
android:layout_
android:layout_marginStart="8dp"
android:gravity="end"
android:paddingEnd="5dp"
android:textSize="16sp"
android:textStyle="bold"
tools:text="Monstruo" />
<TextView
android:id="@+id/grupohuevo2"
android:layout_
android:layout_
android:layout_marginStart="8dp"
android:gravity="end"
android:paddingEnd="5dp"
android:textSize="16sp"
android:textStyle="bold"
tools:text="Planta" />
</LinearLayout>
</LinearLayout>
<LinearLayout
android:layout_
android:layout_
android:orientation="vertical">
<TextView
android:id="@+id/descripcion"
android:layout_
android:layout_
android:layout_margin="5dp"
android:textAlignment="center"
android:textSize="17sp"
android:textStyle="bold"
tools:text="Lorem Ipsum is simply dummy text of the printing and typesetting industry. Otro texto de relleno que pueda ocupar... " />
</LinearLayout>
</LinearLayout>
<LinearLayout
android:layout_
android:layout_
android:orientation="horizontal"
android:layout_marginTop="5dp"
android:layout_marginStart="40dp"
android:layout_marginEnd="50dp">
<LinearLayout
android:layout_
android:layout_
android:orientation="vertical">
<Button
android:id="@+id/STATS"
android:layout_
android:layout_
android:text="@string/stats"
android:textSize="16sp"
android:layout_marginTop="11dp"
tools:ignore="TouchTargetSizeCheck" />
<Button
android:id="@+id/MOVES"
android:layout_
android:layout_
android:backgroundTint="#FDD835"
android:text="@string/moves"
android:textColor="@color/black"
android:textSize="16sp"
tools:ignore="TextContrastCheck,TouchTargetSizeCheck" />
</LinearLayout>
<ImageButton
android:id="@+id/vozPokemon"
android:layout_
android:layout_
android:layout_marginTop="25dp"
android:layout_marginStart="5dp"
android:layout_marginEnd="35dp"
android:layout_marginBottom="10dp"
android:background="@null"
android:contentDescription="@string/contentDescrip"
android:scaleType="fitXY"
android:src="@mipmap/botonaudio"
tools:ignore="SpeakableTextPresentCheck,DuplicateSpeakableTextCheck" />
<com.gauravk.audiovisualizer.visualizer.WaveVisualizer
xmlns:custom="http://schemas.android.com/apk/res-auto"
android:id="@+id/wave"
android:layout_
android:layout_
android:layout_marginTop="34dp"
android:layout_marginEnd="30dp"
custom:avDensity="0.07"
custom:avType="outline"
custom:avColor="#FDD835"
custom:avSpeed="fast"
custom:avWidth="2dp"
custom:avGravity="bottom"
tools:ignore="MissingClass" />
</LinearLayout>
</LinearLayout>
StatsFragment 的.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_
android:layout_
android:orientation="vertical"
tools:context=".StatsFragment">
<LinearLayout
android:layout_
android:layout_
android:orientation="horizontal">
<TextView
android:layout_
android:layout_
android:layout_marginStart="20dp"
android:text="@string/tituloestadisticas"
android:textAlignment="textStart"
android:textSize="30sp"
android:textStyle="italic|bold"
android:background="@color/white" />
<ImageButton
android:id="@+id/btnCerrar"
android:layout_
android:layout_
android:background="@null"
android:contentDescription="@string/contentDescrip"
android:src="@drawable/ic_baseline_close_24"
tools:ignore="DuplicateSpeakableTextCheck,ImageContrastCheck" />
</LinearLayout>
<LinearLayout
android:layout_
android:layout_
android:background="@color/white"
android:orientation="horizontal"
android:paddingTop="4dp">
<LinearLayout
android:layout_
android:layout_
android:orientation="vertical"
android:paddingStart="23dp"
>
<TextView
android:layout_
android:layout_
android:text="@string/ATK"
android:textAlignment="center"
android:textSize="15sp"
android:layout_marginTop="70dp"
android:textStyle="bold|italic" />
<TextView
android:id="@+id/STAT_ATK"
android:layout_
android:layout_
android:textAlignment="center"
android:textSize="15sp"
android:textStyle="bold|italic"
tools:text="@string/ATK" />
<TextView
android:layout_
android:layout_
android:layout_marginTop="75dp"
android:text="@string/DEF"
android:textAlignment="center"
android:textSize="15sp"
android:textStyle="bold|italic" />
<TextView
android:id="@+id/STAT_DEF"
android:layout_
android:layout_
android:text="@string/DEF"
android:textAlignment="center"
android:textSize="15sp"
android:textStyle="bold|italic" />
</LinearLayout>
<LinearLayout
android:layout_
android:layout_
android:orientation="vertical">
<TextView
android:layout_
android:layout_
android:text="@string/HP"
android:textAlignment="center"
android:textSize="15sp"
android:textStyle="bold|italic" />
<TextView
android:id="@+id/STAT_HP"
android:layout_
android:layout_
android:textAlignment="center"
android:textSize="15sp"
android:textStyle="bold|italic"
android:text="@string/HP" />
<com.github.mikephil.charting.charts.RadarChart
android:id="@+id/graficoRadar"
android:layout_
android:layout_
android:background="@color/white"
android:backgroundTint="@color/white" />
<TextView
android:layout_
android:layout_
android:text="@string/SPD"
android:textAlignment="center"
android:textSize="15sp"
android:textStyle="bold|italic" />
<TextView
android:id="@+id/STAT_SPD"
android:layout_
android:layout_
android:text="@string/SPD"
android:textAlignment="center"
android:textSize="15sp"
android:textStyle="bold|italic" />
</LinearLayout>
<LinearLayout
android:layout_
android:layout_
android:orientation="vertical"
android:paddingEnd="20dp">
<TextView
android:layout_
android:layout_
android:text="@string/SP_ATK"
android:layout_marginTop="70dp"
android:textSize="15sp"
android:textStyle="bold|italic" />
<TextView
android:id="@+id/STAT_SPATK"
android:layout_
android:layout_
android:text="@string/SP_ATK"
android:textSize="15sp"
android:textStyle="bold|italic" />
<TextView
android:layout_
android:layout_
android:layout_marginTop="75dp"
android:text="@string/SP_DEF"
android:textSize="15sp"
android:textStyle="bold|italic" />
<TextView
android:id="@+id/STAT_SPDEF"
android:layout_
android:layout_
android:textSize="15sp"
android:textStyle="bold|italic"
android:text="@string/SP_DEF" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
【问题讨论】:
你在 DatosPokemon Activity 中有多少个片段? 我想在 DatosPokemon Activty 中放入 2 个 Fragment,一个称为 StatsFragment,另一个称为 AttackFragment,但它们都不能像我希望的那样正常工作 你们现在有多少人?现在你的 DatosPokemon 活动中是否只有一个片段。还是统计数据片段是您活动的第一个片段 在活动中我只有一个片段,想法是当点击 STATS 按钮时,这个片段会出现在 frameLayout 中,并且一旦查阅了角色的统计信息,我就可以关闭它(从内部相同的片段)并继续查看能力和其他口袋妖怪数据,也许,如果我可以使这部分功能正常,请执行相同的操作以查看角色的动作(动作仍然没有,它只是 .xml 中的一个按钮暂时不会导致任何事情)。是的,ststs 是该活动中的第一个片段 最后一件事,只需发布您的代码中有多少个 layout-xml 文件。他们在哪些活动下进行。因为我觉得你在混合 Activity 和 Fragment 的概念。要么截图并发布你所有的 xml 文件,要么只写你所有的 xml 文件和它们被夸大的活动。例如。 StatisticsFragment 像这样在 DatosPokemonActivity 下。这是我问的最后一个想法。 【参考方案1】:您的代码的问题是您在代码中没有充分利用片段的力量。如果您有片段,您不应该将 Activity 用于任何目的。在您的 DatosPokemonActivity xml 中,您应该只有 FrameLayout 可以帮助您启动您的 fragment 。 Layout 的其余部分,您需要将它们转移到新的 Fragment 中。
Activity和Fragment的关系: Activity 是 Fragment 组驻留并继承其生命周期的地方。
问题的原因: 由于您的 DatosPokemonActivity 只有一个 Fragment ,因此当您在 StatsFragment 上隐藏/回栈时,由于它的回栈中没有任何片段,它会导航到其先前的 Activity ,因此您会错过 DatosPokemonActivity 上的所有信息。
解决方案: 创建一个新的片段。将其视为信息片段。将除 FrameLayout 之外的所有 xml 代码从 DatosPokemonActivity 转移到信息片段以及所需的代码。现在在启动您的 DatosPokemonActivity 时,启动 Information Fragment 。现在,当单击 stats 按钮时,将 Information Fragment 替换为 StatsFragment 并且不要忘记将 InformationFragment 添加到 backStack 。现在,在您的关闭按钮 onClickListener 中,只需使用 fragmentManager.popBackStack 并返回您的信息片段
【讨论】:
如有疑问请咨询 另外你不需要再用上面的方法做 View.Gone / Visible【参考方案2】:在 StatsFragment 中
binding.btnCerrar.setOnClickListener
...
activity.supportFragmentManager?.beginTransaction()?.hide(this)?.commit() // replace this with :
findNavController().navigateUp()
试试这个。
如果你没有使用 Jetpack mb 这个:
activity.supportFragmentManager?.popBackStack()
【讨论】:
不起作用。变量 findNavController 有未解决的引用错误 @LeoRodenas 这意味着你只是不使用 Jetpack 导航。 正如我所说,我是 Android Studio 和一般编程的新手,所以我不知道如何使用喷气背包或导航。但是感谢 Pentiux,感谢您给我的所有帮助 我也将“activity.supportFragmentManager?.beginTransaction()?.hide(this)?.commit()”替换为“activity.supportFragmentManager?.popBackStack()”,并且该更改与总是。单击按钮后,我转到 MainActivity 而不是 DatosPokemonActivity :/ 好的,不仅仅是删除最后两个字符串。 frameFragments - 如果这是你的片段框架,并且它已经消失了,片段@LeoRodenas以上是关于如何从同一片段中的关闭按钮关闭片段?的主要内容,如果未能解决你的问题,请参考以下文章