2016-08-15 5 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); 
     } 
    } 


} 

мой Fragment класс

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


} 

Текст ошибки в 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

Какая линия выбрасывает это исключение? – Acapulco

+1

Измените 'adapter.addFragment (новый FragmentOne()," ONE ");' to 'adapter.addFragment (fragobj," ONE ");'. –

+0

storeText = bundle.getString ("welcome"); эта строка делает исключение –

ответ

1

Вы хотите добавить новый фрагмент вместо того, чтобы использовать тот, который вы сделали и установить аргументы:

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

Изменить это:

adapter.addFragment(fragobj, "ONE"); 

Также рекомендуется использовать шаблон шаблона Abstract Factory с использованием метода 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"); 

, поскольку вы создаете новый объект вместо старого с объектом bundle.

Try ниже код:

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

Спасибо, хорошо Это сработало правильно. –

0

Изменение:

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

To:

adapter.addFragment(fragobj, "ONE"); 

Вы создаете новый экземпляр FragmentOne но Bundle является seted к fragobj.

+0

Спасибо, хорошо Это сработало правильно. –

1

Кажется, проблема с этими линиями:

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

Вы создаете новый фрагмент при вызове добавить фрагмент (не используя тот, который вы использовали для установки аргументов)

Изменить на:

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

Спасибо, хорошо Это сработало правильно. –