2016-08-15 58 views
0

當我嘗試運行此代碼時,它向我顯示一個異常,它是「nullPointer異常」。我找不到這個代碼的錯誤,任何人都可以幫我修復這個錯誤嗎?我的代碼很受歡迎,請幫我修復它。如何發送字符串從活動到使用包的片段

這裏是我的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); 
     } 
    } 


} 

我的片段類logcat的

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; 
    } 


} 

錯誤文本

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

什麼生產線引發此異常? – Acapulco

+1

將'adapter.addFragment(new FragmentOne(),「ONE」);'改爲'adapter.addFragment(fragobj,「ONE」);'。 –

+0

storeText = bundle.getString(「welcome」);這一行使例外 –

回答

1

你添加新的片段,而不是使用您所做的一個,並設置參數:

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

更改爲:

adapter.addFragment(fragobj, "ONE"); 

此外,當實例化af時,建議使用帶有newInstance方法的抽象工廠設計模式ragment,是這樣的:

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

    return fragment; 
} 

然後創建您的片段,如:

FragmentOne fragobj = FragmentOne.newInstance(bundle); 

而在這行你設置參數和創建它。

+0

我真的不明白這個問題。您可以隨時執行getArguments(),然後放入新數據,然後再次設置參數。你面臨的問題是什麼? – Vucko

+1

謝謝你,它的工作正常。 –

1

的問題是在這裏

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

您正在創建一個新的對象,而不是使用捆綁對象的舊對象。

試試下面的代碼:

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

謝謝,它工作正常。 –

0

變化:

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

要:

adapter.addFragment(fragobj, "ONE"); 

您正在創建的FragmentOneBundle新實例seted到fragobj

+0

謝謝,以及它的工作正常。 –

1

似乎是這些線路的一個問題:

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

您正在創建一個新片段,而調用add片段(不使用您已用於設置參數的一個)

更改爲:

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

謝謝,它的工作正常。 –

相關問題