0

我在我的主要活動上有一個選項卡式視圖和一個浮動操作按鈕。每當我點擊浮動操作按鈕時,我想調用一個存在於我的片段代碼中的方法。我在一個空對象引用嘗試了很多東西,但它是說,如何從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

看來你的EducationalDetailsFragment對象爲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(); 

}