0

У меня есть вкладка «Вид» и плавающая кнопка действия в моей основной деятельности. Всякий раз, когда я нажимаю кнопку Floating Action, я хочу вызвать метод, который присутствует в коде моего фрагмента. Я пробовал много вещей, но он говорит, чтоКак вызвать метод фрагмента из активности в android?

Попытка вызвать виртуальный метод «аннулируется com.shyamzawar.makeMyResume.fragments.EducationalDetailsFragment.showChangeLangDialog()» на нулевой ссылке на объект

Вот мой код для UserDetailsActivity:

public class UserDetailsActivity extends AppCompatActivity { 

private Toolbar toolbar; 
private TabLayout tabLayout; 
private ViewPager viewPager; 
private ViewPagerAdapter adapter; 

private int currentPage; 

private FloatingActionButton fab; 

private int readFileRequestCode; 

private int[] tabIcons = { 
     R.drawable.ic_account_circle_white,    //0 Personal Details 
     ... 
     R.drawable.ic_create_white_36dp,    //7 Declaration 
}; 

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

    toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 
    //getSupportActionBar().setDisplayHomeAsUpEnabled(true); 

    //Set Title according to the user clicked 
    String name = "Shyam Zawar"; 
    this.setTitle(name+"'s Profile"); 

    fab = (FloatingActionButton) findViewById(R.id.fab); 

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



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

    fab.setOnClickListener(new View.OnClickListener() 
    { 
     @Override 
     public void onClick(View view) 
     { 
      if (currentPage>0) 
      { 
       switch (currentPage) 
       { 
        case 1: 
         FragmentManager manager = getSupportFragmentManager(); 
         EducationalDetailsFragment educationalDetailsFragment = (EducationalDetailsFragment) manager.findFragmentById(R.id.EduFragment); 
         educationalDetailsFragment.showChangeLangDialog(); 
         break; 
       } 
      } 
     } 
    }); 
} 


private void setupTabIcons() 
{ 
    tabLayout.getTabAt(0).setIcon(tabIcons[0]); 
    ... 
    tabLayout.getTabAt(7).setIcon(tabIcons[7]); 
} 

private void setupViewPager(ViewPager viewPager) 
{ 
    adapter = new ViewPagerAdapter(getSupportFragmentManager()); 
    adapter.addFrag(new PersonalDetailsFragment(), " PERSONAL DETAILS");   //0 
    ... 
    adapter.addFrag(new DeclarationFragment(), " DECLARATION");      //7 
    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); 
    } 
    } 
} 

Вот код для EducationalDetailsFragment.java

public class EducationalDetailsFragment extends Fragment{ 

private FloatingActionButton fab; 
private TextView TextViewEduDetails; 

public EducationalDetailsFragment() { 
    // Required empty public constructor 
} 

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

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 

    View view = inflater.inflate(R.layout.fragment_educational_details, container, false); 

    TextViewEduDetails = (TextView) view.findViewById(R.id.TextViewEduDetails); 

    return view; 
} 

public void setData(String stringData) 
{ 
    TextViewEduDetails.setText(stringData); 
} 

public void showChangeLangDialog() { 
    AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(getContext()); 
    LayoutInflater inflater = getActivity().getLayoutInflater(); 
    final View dialogView = inflater.inflate(R.layout.educational_details_dialog, null); 
    dialogBuilder.setView(dialogView); 

    dialogBuilder.setTitle("Educational Details"); 
    dialogBuilder.setPositiveButton("Done", new DialogInterface.OnClickListener() { 
     public void onClick(DialogInterface dialog, int whichButton) {} 
    }); 
    dialogBuilder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 
     public void onClick(DialogInterface dialog, int whichButton) {} 
    }); 
    AlertDialog b = dialogBuilder.create(); 
    b.show(); 
} 

} 

ответ

0

Вы можете глобально объявить educationFragment

private EducationalDetailsFragment mEducationalDetailsFragment; 


//in your setupViewPager() method 
mEducationalDetailsFragment = new EducationalDetailsFragment(); 
adapter.addFrag(mEducationalDetailsFragment , "Whatever the Name"); 


onYourFabClickListerner(){ 
    call the method by using mEducationalDetailsFragment 
} 
+0

Спасибо много, Это работало @android_griezmann –

+0

@ShyamZawar С удовольствием помогите! –

1

Кажется, ваш объект EducationDetailsFragment имеет значение null. Используйте это, чтобы извлечь фрагмент из своего viewpager. Его лучше практики:

Fragment EducationalDetailsFragment = viewPager.getAdapter().getItem(index); 

Если вы не знаете index. Вы можете установить тег на фрагменте при их создании и найти их по тэгу от адаптера ViewPager;) фрагмент

0

изменения:

public void changeFragment(Fragment fragment){ 
    fragmentManager = getSupportFragmentManager(); 
    fragmentTransaction = fragmentManager.beginTransaction().replace(R.id.content, 
      fragment).commit(); 

}