2016-08-15 3 views
0

Wenn ich versuche, diesen Code auszuführen, zeigt es mir eine Ausnahme und es ist "nullPointer Ausnahme". Ich kann den Fehler dieses Codes nicht finden, kann mir bitte jemand helfen, diesen Fehler zu beheben? Mein Code ist blasen bitte hilf mir, es zu beheben.Wie Zeichenfolge senden von Aktivität zu Fragment mit Bundle

hier ist mein MainActivity

public class MainActivity extends AppCompatActivity { 

    private TabLayout tabLayout; 
    private ViewPager viewPager; 
    EditText testInputTV; 
    Button send; 
    Bundle bundle; 
    String welcome ="Welcome"; 



    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 


     testInputTV = (EditText) findViewById(R.id.testInput); 

     send= (Button) findViewById(R.id.send); 

     viewPager = (ViewPager) findViewById(R.id.viewpager); 
     setupViewPager(viewPager); 

     tabLayout = (TabLayout) findViewById(R.id.tabs); 
     tabLayout.setupWithViewPager(viewPager); 


    } 

    public void setupViewPager(ViewPager viewPager) { 
     ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager()); 

     bundle =new Bundle(); 
     bundle.putString("welcome", welcome); 
     FragmentOne fragobj = new FragmentOne(); 
     fragobj.setArguments(bundle); 
     adapter.addFragment(new FragmentOne(), "ONE"); 
     viewPager.setAdapter(adapter); 

    } 



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

     public ViewPagerAdapter(android.support.v4.app.FragmentManager manager) { 
      super(manager); 
     } 

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

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

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

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


} 

mein Fragment Klasse

public class FragmentOne extends Fragment { 

    String storeText; 
    private Bundle bundle; 

    public FragmentOne() { 
    } 


    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     // Inflate the layout for this fragment 
     View view=inflater.inflate(R.layout.fragment_fragment_one, container, false); 
     bundle = this.getArguments(); 
     storeText = bundle.getString("welcome"); 
     Toast.makeText(getContext().getApplicationContext(),storeText,Toast.LENGTH_SHORT).show(); 

     return view; 
    } 


} 

Fehlertext in Logcat

java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.os.Bundle.getString(java.lang.String)' on a null object reference 
+0

Welche Zeile wirft diese Ausnahme? – Acapulco

+1

Ändern Sie 'adapter.addFragment (new FragmentOne()," ONE ");' to 'adapter.addFragment (fragobj," ONE ");'. –

+0

storeText = bundle.getString ("Willkommen"); Diese Zeile macht die Ausnahme –

Antwort

1

Sie ein neues Fragment hinzugefügt, anstatt die von Ihnen gemacht und legen Sie die Argumente an:

adapter.addFragment(new FragmentOne(), "ONE"); 

Ändern Sie diese an:

adapter.addFragment(fragobj, "ONE"); 

Es wird auch empfohlen, Abstract Factory Entwurfsmuster mit newInstance Methode bei der Instanziierung von af zu verwenden ragment, so etwas wie:

public static FragmentOne newInstance(Bundle b) { 
    FragmentOne fragment = new FragmentOne(); 
    fragment.setArguments(b); 

    return fragment; 
} 

Und dann erstellen Sie Ihr Fragment wie:

FragmentOne fragobj = FragmentOne.newInstance(bundle); 

Und in dieser Linie sind Sie Argumente setzen und es auch zu schaffen.

+0

Ich verstehe die Frage nicht wirklich. Sie können 'getArguments()' wann immer ausführen und dann die neuen Daten einfügen und dann die Argumente erneut setzen. Was ist das Problem, vor dem Sie stehen? – Vucko

+1

Vielen Dank, nun, es hat richtig funktioniert. –

1

Das Problem hier ist

adapter.addFragment(new FragmentOne(), "ONE"); 

, da Sie ein neues Objekt anstelle eines alten Objekts mit Bündelobjekt erstellen.

Try unten Code:

adapter.addFragment(fragobj, "ONE"); 
+0

Vielen Dank, nun, es hat richtig funktioniert. –

0

Wechsel:

adapter.addFragment(new FragmentOne(), "ONE"); 

An:

adapter.addFragment(fragobj, "ONE"); 

Sie schaffen neue Instanz von FragmentOne aber Bundle ist seted zu fragobj.

+0

Danke, nun, es hat richtig funktioniert. –

1

scheint ein Problem mit diesen Zeilen zu sein:

FragmentOne fragobj = new FragmentOne(); 
fragobj.setArguments(bundle); 
adapter.addFragment(new FragmentOne(), "ONE"); 

Sie ein neues Fragment zu schaffen, während Fragment Aufruf hinzufügen (nicht das eine mit dem Sie für die Einstellung Argumente verwendet haben)

Wechseln zu:

FragmentOne fragobj = new FragmentOne(); 
fragobj.setArguments(bundle); 
adapter.addFragment(fragobj, "ONE"); 
+0

Vielen Dank, es hat gut funktioniert. –

Verwandte Themen