2016-08-15 46 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

谢谢,它的工作正常。 –