Tengo una actividad que crea y rellena de un Fragmento a través de un adoptante clase. Quiero transmitir valores y objetos a este Fragmento adoptante clase para que yo pueda dictar diseño etc.

He intentado pasar paquetes utilizando el setArgument método, pero mi código de bombas y no sé por qué. Como yo lo entiendo, puedo recoger el paquete en el método onCreate en la adoptante de la clase. Veo que los argumentos están configurados correctamente inmediatamente después de que el código comentado, pero por desgracia se bloquea después de eso y no entiendo por qué. Si puedo quitar el paquete de código que no se bloquee. 🙁

A continuación es mi código, ¿alguien sabe donde debo poner el paquete de código, comentó a cabo?

public class LoginScreen extends ActionBarActivity {
private final String ARG_SELECTED_LAYOUT_ID = "selectedLayoutId";
private final int DEFAULT_LAYOUT = R.layout.layout_list;
private int mSelectedLayoutId;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
ActionBar actionBar = getSupportActionBar();
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
actionBar.setDisplayShowTitleEnabled(false);
actionBar.setDisplayShowHomeEnabled(false);
mSelectedLayoutId = DEFAULT_LAYOUT;
if (savedInstanceState != null) {
mSelectedLayoutId = savedInstanceState.getInt(ARG_SELECTED_LAYOUT_ID);
}
addLayoutTab(
actionBar, R.layout.layout_list, R.drawable.ic_list, "list");
addLayoutTab(
actionBar, R.layout.layout_grid, R.drawable.ic_grid, "grid");
addLayoutTab(
actionBar, R.layout.layout_staggered_grid, R.drawable.ic_staggered, "staggered");
addLayoutTab(
actionBar, R.layout.layout_spannable_grid, R.drawable.ic_spannable, "spannable");
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt(ARG_SELECTED_LAYOUT_ID, mSelectedLayoutId);
}
private void addLayoutTab(ActionBar actionBar, int layoutId, int iconId, String tag) {
ActionBar.Tab tab = actionBar.newTab()
.setText("")
.setIcon(iconId)
.setTabListener(new TabListener(layoutId, tag));
actionBar.addTab(tab, layoutId == mSelectedLayoutId);
}
public class TabListener implements ActionBar.TabListener {
private LayoutFragment mFragment;
private final int mLayoutId;
private final String mTag;
public TabListener(int layoutId, String tag) {
mLayoutId = layoutId;
mTag = tag;
}
@Override
public void onTabSelected(ActionBar.Tab tab, FragmentTransaction ft) {
mFragment = (LayoutFragment) getSupportFragmentManager().findFragmentByTag(mTag);
if (mFragment == null) {
mFragment = (LayoutFragment) LayoutFragment.newInstance(mLayoutId);
ft.add(R.id.content, mFragment, mTag);
} else {
ft.attach(mFragment);
}
/*
Bundle bundle = new Bundle();
bundle.putInt("noTiles", 4);
mFragment.setArguments(bundle);           
*/
mSelectedLayoutId = mFragment.getLayoutId();
}
@Override
public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction ft) {
if (mFragment != null) {
ft.detach(mFragment);
}
}
@Override
public void onTabReselected(ActionBar.Tab tab, FragmentTransaction ft) {
}
}

}

Logcat

03-03 11:56:53.675  32507-32507/weebuns.predictionking E/AndroidRuntime FATAL EXCEPTION: main
Process: weebuns.predictionking, PID: 32507
java.lang.RuntimeException: Unable to start activity ComponentInfo{weebuns.predictionking/weebuns.predictionking.LoginScreen}: java.lang.NullPointerException: Attempt to invoke virtual method 'void weebuns.predictionking.LayoutFragment.setArguments(android.os.Bundle)' on a null object reference
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2298)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360)
at android.app.ActivityThread.access$800(ActivityThread.java:144)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5221)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void weebuns.predictionking.LayoutFragment.setArguments(android.os.Bundle)' on a null object reference
  • ¿cuál es el logcat de error que usted está consiguiendo con descomentado código ?
  • Añadido logcat 🙂
  • enviar paquete cuando se crea la instancia:mFragment = (LayoutFragment) LayoutFragment.newInstance(mLayoutId,YourBundle);
  • puedo obtener Causada por: java.lang.NullPointerException: Intento de invocar el método virtual ‘void weebuns.predictionking.LayoutFragment.setArguments(android.os.Bundle) » en un objeto nulo error de referencia
InformationsquelleAutor Fearghal | 2015-03-03

5 Comentarios

  1. 1

    Es difícil de decir sin ver el logcat, pero seguro que te falta para llamar a la commit() método en el FragmentTransaction. También recuerde que para establecer los argumentos para el fragmento antes de llamar a ft.commit().

    @Override
    public void onTabSelected(ActionBar.Tab tab, FragmentTransaction ft) {
    mFragment = (LayoutFragment) getSupportFragmentManager().findFragmentByTag(mTag);
    if (mFragment == null) {
    Bundle bundle = new Bundle();
    bundle.putInt("noTiles", 4);
    mFragment = (LayoutFragment) LayoutFragment.newInstance(mLayoutId);
    mFragment.setArguments(bundle);
    //ft.add(R.id.content, mFragment, mTag).commit();
    ft.add(R.id.content, mFragment, mTag);
    } else {
    ft.attach(mFragment);
    }
    mSelectedLayoutId = mFragment.getLayoutId();
    }
    • me estoy poniendo de error: Causada por: java.lang.NullPointerException: Intento de invocar el método virtual ‘void weebuns.predictionking.LayoutFragment.setArguments(android.os.Bundle) en una referencia de objeto null
    • Progresando…..Nuevo tema: Proceso: weebuns.predictionking, PID: 19902 java.lang.RuntimeException: no se puede iniciar la actividad ComponentInfo{weebuns.predictionking/weebuns.predictionking.LoginScreen}: java.lang.IllegalStateException: confirmar que ya se conocen. No puedo ver en que se haya cometido tbh
    • Por tanto, parece que la commit() es llamado automáticamente por la Actividad en efecto, puesto que es un parmeter de onTabSelected(). Pruebe el nuevo código que he publicado.
    • 🙁 volver al problema original…. …AndroidRuntime﹕ de EXCEPCIÓN FATAL: Proceso principal: weebuns.predictionking, PID: 26186 java.lang.RuntimeException: no se puede iniciar la actividad ComponentInfo{….LoginScreen}: android.contenido.res.Recursos$NotFoundException: Resource ID #0 x 0 en com.android.interna.os.ZygoteInit.principal(ZygoteInit.java:694) Causada por: android.contenido.res.Recursos$NotFoundException: Resource ID #0 x 0
    • En este caso, el problema podría estar en el fragmento. Qué se puede hacer con el argumento pasado a ella?
    • Nada por el momento – no he editado el Fragmento de código para ‘getArguments aún. Estaba a la espera de obtener la setArg(bundle) código de trabajo -, ¿crees que este código debe ser implementado de forma simultánea?
    • Permítanos continuar esta discusión en el chat.

  2. 3

    A pasar como argumento a su fragmento, se recomienda crear un método estático público a instancias de su fragmento como :

    public static MyFragment newInstance(String firstArg) {
    MyFragment f = new MyFragment ();
    Bundle args = new Bundle();
    args.putString("ARG1", firstArg);
    f.setArguments(args);
    return f;
    }

    Y, a continuación, recuperar su args en onCreateView() método como :

    String arg = getArguments().getString("ARG1");

    Utilice el método estático a instancias de un nuevo fragmento con sus argumentos en otro fragmento o actividades como :

    MyFragment f = MyFragment.newInstance(myArg);
  3. 3

    De la Actividad a la que enviar los datos con la intención como:

      Bundle bundle = new Bundle();
    bundle.putString("edttext", "From Activity");
    //set Fragmentclass Arguments
    Fragmentclass fragobj = new Fragmentclass();
    fragobj.setArguments(bundle);
    ft.add(R.id.content, fragobj, mTag);

    y en el Fragmento método onCreateView:

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
    Bundle savedInstanceState) {
    String strtext = getArguments().getString("edttext");    
    return inflater.inflate(R.layout.fragment, container, false);
    }
    • Thx, pero me han dicho código y se rompe, donde debe este código? Es mi paquete de código correcto? Ver mi código publicados por el comentado problema de código.
  4. 1

    En su actividad

    Bundle args = new Bundle();
    args.putString("Menu", "Your String");
    Fragment detail = new FragmeantOne();
    detail.setArguments(args);
    FragmentManager fragmentManager = getFragmentManager();
    fragmentManager.beginTransaction().replace(R.id.content_frame, detail).commit();

    En su Fragmento.. en onCreateView()

    String menu = getArguments().getString("Menu");
    someTextView.setText(menu);
  5. 1

    Puede utilizar el Paquete de transferencia de datos de la actividad de fragmentos o transfre de datos a partir de un fragmento a fragmento.

    Bundle bundle = new Bundle();
    DisplayDataList fragment = new DisplayDataList();
    bundle.putString("listitem", "Buyer,Seller");
    fragment.setArguments(bundle);
    getFragmentManager().beginTransaction().replace(
    R.id.frame_container, fragment).addToBackStack(null).commit();

    Donde desea recibir ese paquete que yo.w en DisplayDataList Fragmento de la clase. Usted tiene que usar getArguments() método.

    DisplayDataList

     Bundle bundle = getArguments();
    String getdata = bundle.getString("listitem");
    System.out.println("Data got-->>> " + getdata);

    Espero que esto le ayudará.

    • Thx, pero me han dicho código (o un intento de ella) y se rompe, donde debe este código? Es mi paquete de código correcto? Ver mi código publicados por el comentado problema de código. Puede usted poner su código en el contexto de la mina – los nombres de clase, etc, así puedo ver mejor donde va a parar como afaics mina debe, al menos, no bloquee la aplicación.
    • El uso de Paquete de código antes de la sustitución o la adición de nuevos fragmento y asegúrese de que está pasando el bundle con el fragmento de objeto de reemplazar el código.Pruebe este LayoutFragment mFragment = new LayoutFragment(); Bundle bundle = new Bundle(); bundle.putInt(«noTiles», 4); mFragment.setArguments(bundle); si (mFragment == null) { mFragment = (LayoutFragment) LayoutFragment.newInstance(mLayoutId); ft.agregar(R. id.contenido, mFragment, becas mtag); } else { ft.adjuntar(mFragment); }
    • Me sale el siguiente error: Causada por: java.lang.NullPointerException: Intento de invocar el método virtual ‘void weebuns.predictionking.LayoutFragment.setArguments(android.os.Bundle) en una referencia de objeto null

Dejar respuesta

Please enter your comment!
Please enter your name here