Este grupo de expertos luego de ciertos días de investigación y de juntar de datos, dimos con los datos necesarios, deseamos que te resulte útil para tu proyecto.
Solución:
Respondiendo a mi propia pregunta, ya que encontré el enfoque correcto en la documentación de navegación actualizada.
En el momento de escribir esta respuesta, estoy usando Navigation 2.2.0-alpha01
Si desea pasar algunos datos al destino de inicio directamente como argumentos de la actividad del host, debe configurar manualmente el gráfico de navegación de su host dentro del método onCreate () de la actividad del host, como se muestra a continuación:
Consiga su navController:
val navController by lazy findNavController(R.id.)
Luego, en la actividad del anfitrión onCreate()
val bundle = Bundle()
bundle.putString("some_argument", "some_value")
navController.setGraph(R.navigation., bundle)
O si desea pasar todos los extras de la intención tal como está al inicioDestination:
navController.setGraph(R.navigation., intent.extras)
Ya que intent.extras
devolvería un Bundle
solamente
Cuando configura navGraph usando el método setGraph (), debe evitar configurar la aplicación: NavGraph attribute en la definición de NavHostFragment, porque hacerlo da como resultado inflar y configurar el gráfico de navegación dos veces.
Mientras lee estos argumentos en su fragmento startDestination:
Si está utilizando el complemento Safe Args (que es muy recomendable), en su fragmento:
private val args by navArgs()
El complemento Safe Args generaría una clase Args agregando Args al nombre de su fragmento. Por ejemplo, si tu fragmento se llama DummyFragment
entonces Safe Args generaría una clase llamada DummyFragmentArgs
dónde navArgs<>
es una función de extensión definida en Android KTX
Si no está utilizando Android KTX, puede obtener el objeto args como:
val args = DummyFragmentArgs.fromBundle(arguments!!)
Una vez que haya adquirido el objeto de argumentos, simplemente puede buscar sus argumentos:
args.someArgument
Fíjate como pasamos "some_argument"
como argumento, y lo estamos leyendo como someArgument
usando Safe Args
Si no está usando Safe Args (aunque no hay razón para no usarlo), puede acceder a sus argumentos de esta manera:
arguments?.getString("some_argument")
Todo esto está documentado en la documentación del componente Migrate to Navigation aquí: https://developer.android.com/guide/navigation/navigation-migrate#pass_activity_destination_args_to_a_start_destination_fragment
también me encontré con el mismo problema,
Así es como lo resolví:
- Eliminar la configuración xml de NavHostFragment desde
your_activity.xml
: es decir, eliminar aplicación: navGraph = “@ navigation / nav_graph
Así es como debería verse su XML.
-
Agregar Configuración de NavHostFragment de forma programada en
onCreate()
de actividad. Y pasar datos de paquetes usandoNavGraph.addDefaultArguments(bundleData)
apioverride fun onCreate(savedInstanceState: Bundle?) super.onCreate(savedInstanceState) setContentView(R.layout.editor_layout) setupNavigation() private fun setupNavigation() val navHostFragment = nav_host as NavHostFragment val navController = navHostFragment.navController val navInflater = navController.navInflater val graph = navInflater.inflate(R.navigation.nav_graph) graph.addDefaultArguments(intent!!.extras!!) // This is where you pass the bundle data from Activity to StartDestination navHostFragment.navController.graph = graph
ACTUALIZAR:
Dependencias en mi archivo Project Gradle:
dependencies
def nav_version = "1.0.0-alpha08"
implementation "android.arch.navigation:navigation-fragment:$nav_version" // use -ktx for Kotlin
implementation "android.arch.navigation:navigation-ui:$nav_version" // use -ktx for Kotlin
}
NOTA: En la versión del componente de navegación 1.0.0-alpha09
por alguna razón, Google no tiene un método como addDefaultArguments()
podría arreglarse pronto. Pero las versiones inferiores tienen addDefaultArguments()
método He comprobado tanto en java como en kotlin, así que intente usar 1.0.0-alpha07
o 1.0.0-alpha08
Encontré la solución después de investigar un poco. Funciona con la última versión de la biblioteca de navegación. Consulte el siguiente código:
-
Agregue esto en el diseño de su actividad. Nota: no estamos configurando aplicación: navGraph argumento en el archivo xml. Lo configuraremos dinámicamente.
-
En su archivo java de actividad, escriba el siguiente código y realice los cambios correspondientes. Usar NavArgument para pasar el valor de su argumento y agregar el argumento a su gráfico de navegación personalizado y luego configurar el gráfico.
public class YourActivity extends AppCompatActivity private NavArgument nameArg, mailArg; @Override protected void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState); setContentView(R.layout.profile); nameArg = new NavArgument.Builder().setDefaultValue("your name").build(); mailArg = new NavArgument.Builder().setDefaultValue("your email id").build(); NavController navController = Navigation.findNavController(this, R.id.fragment); NavInflater navInflater = navController.getNavInflater(); NavGraph navGraph = navInflater.inflate(R.navigation.nav_profile_graph); navGraph.addArgument("your name key", nameArg); navGraph.addArgument("your mail key", mailArg); navController.setGraph(navGraph);
-
Escriba el gráfico de navegación a continuación y agregue el mismo argumento keys al fragmento inicial.
-
En su fragmento, simplemente obtenga los valores usando la función getArguments ().
String name = getArguments().getString("your name key"); String mail = getArguments().getString("your mail key");
Te mostramos reseñas y calificaciones
No se te olvide dar difusión a este enunciado si te fue de ayuda.