0

Ich habe eine Tabbed-Ansicht und eine Floating Action-Schaltfläche auf meiner Hauptaktivität. Immer wenn ich auf den Floating-Action-Button klicke, möchte ich eine Methode aufrufen, die im Code meines Fragments vorhanden ist. Ich habe versucht, viele Dinge, aber es sagt, dassSo rufen Sie eine Fragmentmethode aus einer Aktivität in Android auf?

Versuch auf einer Null-Objekt Referenz

Hier virtuelle Methode ‚Leer com.shyamzawar.makeMyResume.fragments.EducationalDetailsFragment.showChangeLangDialog()‘ aufrufe meines Code für 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); 
    } 
    } 
} 

Hier ist der Code für 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(); 
} 

} 

Antwort

0

Sie können Ihre 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

Dank global deklarieren eine Menge, es hat @android_griezmann –

+0

@ShyamZawar geholfen, zu helfen! –

1

Ihr EducationalDetailsFragment-Objekt scheint null zu sein. Verwenden Sie diese Option, um Ihr Fragment von Ihrem Viewpager abzurufen. Es ist eine bessere Praxis:

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

Wenn Sie die index weiß nicht. Sie können einen Tag zu Ihrem Fragmente gesetzt, wenn Sie sie erstellen und sie nach Tag von Ihrem viewpager Adapter finden;)

0

Änderung Fragment:

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

} 
Verwandte Themen