0

Ich habe diese Anleitung hier verwendet, um die Aktivität zu machen: http://www.androidhive.info/2015/09/android-material-design-working-with-tabsTablayout Bündel in fragment - Null-Objekt Referenz

Ich habe dann eine AsyncTask hinzugefügt.

I

Activity.java

private void setupViewPager(ViewPager viewPager) { 
    ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager()); 
    adapter.addFrag(new ProfileFragment(), "Profile"); 
    viewPager.setAdapter(adapter); 
} 

class ViewPagerAdapter extends FragmentPagerAdapter { 
    private final List<Fragment> mFragmentList = new ArrayList<>(); 
    private final List<String> mFragmentTitleList = new ArrayList<>(); 

    public ViewPagerAdapter(FragmentManager manager) { 
     super(manager); 
    } 

    @Override 
    public Fragment getItem(int position) { 
     return mFragmentList.get(position); 
    } 

    @Override 
    public int getCount() { 
     return mFragmentList.size(); 
    } 

    public void addFrag(Fragment fragment, String title) { 
     mFragmentList.add(fragment); 
     mFragmentTitleList.add(title); 
    } 

    @Override 
    public CharSequence getPageTitle(int position) { 
     return mFragmentTitleList.get(position); 
    } 
} 

@Override 
    protected void onPostExecute(String JSON_STRING_GET_ID) { 
     try { 
      JSONObject jsonResponse = new JSONObject(JSON_STRING_GET_ID); 
      JSONArray jsonMainNode = jsonResponse.optJSONArray("server_response"); 

      for (int i = 0; i < jsonMainNode.length(); i++) { 
       JSONObject jsonChildNode = jsonMainNode.getJSONObject(i); 
       get_nav_email = jsonChildNode.optString("email"); 

       Bundle bundle = new Bundle(); 
       bundle.putString("p_email", get_nav_email); 
       ProfileFragment fragToProfile = new ProfileFragment(); 
       fragToProfile.setArguments(bundle); 

      } 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 
    } 

ProfileFragment.java passieren versuche:

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    View myInflatedView = inflater.inflate(R.layout.fragment_profile, container,false); 

    String p_email = getArguments().getString("p_email"); 
    TextView txtTitle = (TextView)myInflatedView.findViewById(R.id.tvUsername2); 
    txtTitle.setText(p_email); 
    // Inflate the layout for this fragment 
    return myInflatedView; 
} 

Hier ist der Fehler, den ich bekommen:

1779-1779/com.testing.dev.application E/AndroidRuntime: FATAL EXCEPTION: main 
                       Process: com.testing.dev.application, PID: 1779 
                       java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.os.Bundle.getString(java.lang.String)' on a null object reference 
                        at com.testing.dev.application.fragment.ProfileFragment.onCreateView(ProfileFragment.java:43) 
                        at android.support.v4.app.Fragment.performCreateView(Fragment.java:1974) 
                        at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1067) 
                        at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1252) 
                        at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:738) 
                        at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1617) 
                        at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:570) 
                        at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:141) 
                        at android.support.v4.view.ViewPager.populate(ViewPager.java:1177) 
                        at android.support.v4.view.ViewPager.populate(ViewPager.java:1025) 
                        at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1545) 
                        at android.view.View.measure(View.java:17547) 
                        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5535) 
                        at android.support.design.widget.CoordinatorLayout.onMeasureChild(CoordinatorLayout.java:664) 
                        at android.support.design.widget.CoordinatorLayout.onMeasure(CoordinatorLayout.java:731) 
                        at android.view.View.measure(View.java:17547) 
                        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5535) 
                        at android.widget.FrameLayout.onMeasure(FrameLayout.java:436) 
                        at android.support.v7.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:135) 
                        at android.view.View.measure(View.java:17547) 
                        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5535) 
                        at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1436) 
                        at android.widget.LinearLayout.measureVertical(LinearLayout.java:722) 
                        at android.widget.LinearLayout.onMeasure(LinearLayout.java:613) 
                        at android.view.View.measure(View.java:17547) 
                        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5535) 
                        at android.widget.FrameLayout.onMeasure(FrameLayout.java:436) 
                        at android.view.View.measure(View.java:17547) 
                        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5535) 
                        at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1436) 
                        at android.widget.LinearLayout.measureVertical(LinearLayout.java:722) 
                        at android.widget.LinearLayout.onMeasure(LinearLayout.java:613) 
                        at android.view.View.measure(View.java:17547) 
                        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5535) 
                        at android.widget.FrameLayout.onMeasure(FrameLayout.java:436) 
                        at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2615) 
                        at android.view.View.measure(View.java:17547) 
                        at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2015) 
                        at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1173) 
                        at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1379) 
                        at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1061) 
                        at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5885) 
                        at android.view.Choreographer$CallbackRecord.run(Choreographer.java:767) 
                        at android.view.Choreographer.doCallbacks(Choreographer.java:580) 
                        at android.view.Choreographer.doFrame(Choreographer.java:550) 
                        at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:753) 
                        at android.os.Handler.handleCallback(Handler.java:739) 
                        at android.os.Handler.dispatchMessage(Handler.java:95) 
                        at android.os.Looper.loop(Looper.java:135) 
                        at android.app.ActivityThread.main(ActivityThread.java:5254) 
                        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:903) 
                        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 
+0

Zunächst einmal, wenn Sie ein Array innerhalb von OnPostExecute durchlaufen, wie Sie es tun, überschreiben Sie den vorherigen Wert und das scheint nicht, was Sie hier wirklich wollen. Außerdem stellst du das Fragment nicht wirklich in die Ansicht – Eenvincible

+0

@Eenvincible Kannst du mir sagen, was du meinst? Ich füge das Fragment mit dem Code setupViewPager und ViewPagerAdapter hinzu. Ich habe das OP bearbeitet. – Edward

Antwort

1

Ich habe eine Vorgehensweise, die Sie hier in Betracht ziehen könnten! Aber natürlich liegt es an dir.

Erstellen Sie Ihre ViewPagerAdapter Klasse und in Ihrem addFrag() -Methode, möchten Sie den Wert Ihrer E-Mail wie folgt weitergeben müssen:

private String emailAddress; 

public ViewPagerAdapter(FragmentManager manager, String email) { 
    super(manager); 
    emailAddress = email; 
} 

gefügten den Konstruktor Ihrer ViewPagerAdapter ist, die Sie in Ihrer Aktivität schaffen.

Innerhalb der gleichen ViewPagerAdapter Klasse, werden Sie diese Methode haben addFrag

public void addFrag(Fragment fragment, String title) { 
    Bundle bundle = new Bundle(); 
    //important line here to note 
    bundle.putString("email", emailAddress); 

    fragment.setArguments(bundle); 
    mFragmentList.add(fragment); 
    mFragmentTitleList.add(title); 
} 

Nachdem Sie nun die E-Mail an das Fragment sind vorbei, in Ihrem onAttach Methode des Fragments, können Sie es und Satz extrahieren als Variable auf Klassenebene.

@Override 
public void onAttach(Context ctx){ 
    super.onAttach(ctx); 



    String emailAddress = getArguments().getInt("email"); 

    //do whatever you need here 
} 

Wenn Sie jedoch das Fragment ohne dass ein Benutzer aktualisieren möchten die Registerkarten zu berühren, wie später, nachdem der AsyncTask abgeschlossen ist, können Sie Events Blick in Verwendung.

Sie lassen das Fragment, das Sie aktualisieren möchten, grundsätzlich ein neues Ereignis von der onPostExecute-Methode von AsyncTask abonnieren.

Meine Lieblingsbibliothek ist EventBus

mit dem Sie einfach Ihre build.gradle Datei wie folgt hinzufügen:

compile 'org.greenrobot:eventbus:3.0.0' 

Ich hoffe, das hilft und lassen Sie es mich wissen, wenn Sie weitere Hilfe benötigen !

+0

Vielen Dank für all das, aber das ist nicht das, was ich brauchte. Ich muss wissen, warum das Übergeben einer Zeichenfolge mit einem Bündel nicht funktioniert und warum ich es nicht in dem Fragment bekommen kann. – Edward

+0

Nun, ich denke du verpasst etwas mit deinem Code; aber mit Ihrem onPostExecute erstellen Sie einfach eine neue Instanz Ihres Fragments und setzen das Bundle dann nichts damit! – Eenvincible

+0

Bei onPostExecute soll es Informationen in das Bundle und dann auf die Fragmentseite bringen, die es bekommen soll. – Edward

0

Sie sind versuchen, aus zu bekommen Bündel, wenn Bundle null ist. Versuchen Überprüfung hinzufügen, wenn Bündel null ist:

String p_email = null; 
if(getArguments() != null) { 
    p_email = getArguments().getString("p_email"); 
} 
+0

Ja, das überprüft, ob das Argument null ist oder nicht. Ich möchte, dass es das Argument erfolgreich besteht und es dann bekommt. Ich habe es versucht: bundle.putString ("p_email", "Test string"); aber es funktioniert auch nicht. – Edward

+0

Ändern sich Ihre Tabs? – iamtodor

+0

Nein, ich bekomme immer noch den Fehler. – Edward

0

Sie Argumente an die Fragment mit setArguments Methode übergeben sollte. Die Verwendung der Methode anstatt des Standardkonstruktors ist im Allgemeinen die empfohlene Methode, um Fragmente zu instanziieren.

Siehe this und this.

+0

Ich habe das versucht und es funktioniert immer noch nicht. – Edward