如何从android中的活动调用片段方法?

     2023-03-22     290

关键词:

【中文标题】如何从android中的活动调用片段方法?【英文标题】:How to call a fragment method from an activity in android? 【发布时间】:2016-10-11 05:45:36 【问题描述】:

我的主活动上有一个选项卡式视图和一个浮动操作按钮。每当我单击浮动操作按钮时,我都想调用片段代码中存在的方法。我尝试了很多东西,但它是说

尝试在空对象引用上调用虚拟方法“void 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();



【问题讨论】:

【参考方案1】:

你可以全局声明你的educationFragment

private EducationalDetailsFragment mEducationalDetailsFragment;


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


onYourFabClickListerner()
     call the method by using mEducationalDetailsFragment

【讨论】:

@ShyamZawar 乐于助人!【参考方案2】:

您的 EducationalDetailsFragment 对象似乎为空。使用它从您的浏览器中检索您的片段。这是一个更好的做法:

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

如果你不知道index。您可以在创建片段时为片段设置标签,并通过 viewpager 适配器中的标签找到它们;)

【讨论】:

【参考方案3】:

更改片段:

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


【讨论】:

如何从活动中调用片段方法?

...述】:我希望每个人都做得很好,我是一名初学者级别的Android开发人员,我正在制作一个计数器Android应用程序,它可以使用我们设备上的音量键递增和递减。无论用户按下音量增大或减小按钮(长按)多长时间,应用都会增加... 查看详情

如何从主要活动中调用片段方法

】如何从主要活动中调用片段方法【英文标题】:Howtocallfragmentmethodfrommainactivity【发布时间】:2016-06-1507:31:12【问题描述】:我在片段类中有方法。我想从主要活动中调用该方法,但我不想使用FragmentById(或)FragmentByTag。我的... 查看详情

从活动中调用片段事件

...】:所以,我让我的片段中的事件传递给活动,那么我该如何做才能让活动轮流通知片段B做某事。当片段A单击列表项时,我想对B进行片段填充以填充自定义列表。那么,它将事件发送到活动,现在我如何让活动调用片段B中的... 查看详情

从片段调用活动方法

...:2012-09-2112:05:18【问题描述】:尝试从片段调用我的活动中的方法。我希望片段提供方法数据并在方法返回时获取数据。我想实现类似于调用静态方法,但不使用静态,因为它会在活动中产生问题。对Fragment不熟悉,所以我需要... 查看详情

java示例代码_从android中的非活动类调用服务方法

java示例代码_从android中的非活动类调用服务方法 查看详情

Android:从片段调用时如何从活动中获取返回结果?

】Android:从片段调用时如何从活动中获取返回结果?【英文标题】:Android:HowtogetreturnresultfromactivitywhencallingfromFragment?【发布时间】:2013-09-2709:18:29【问题描述】:我有一个Fragment使用以下方式调用另一个Activity:ProductEditionMainten... 查看详情

如何从Android中没有活动和片段的函数调用DialogFragment?

】如何从Android中没有活动和片段的函数调用DialogFragment?【英文标题】:HowtoinvokeDialogFragmentfromfunctionwhichisoutofactivityandfragmentinAndroid?【发布时间】:2020-09-2512:02:22【问题描述】:我有一个名为Dialog的DialogFragment。如何从Android中没... 查看详情

如何从其他活动访问主要活动中的实例变量和方法? [复制]

...【发布时间】:2012-08-2507:33:47【问题描述】:可能重复:Android:Howtodeclareglobalvariables?我想从其他活动访问主要活动中的公共实例变量。我想在主要活动中调用公 查看详情

从片段内部调用活动方法[重复]

...1-1215:36:03【问题描述】:我正在尝试从片段屏幕调用活动中的方法。我有一个名为myMethod()的方法,它位于名为MyActivity的活动中;我有一个名为Screen1Fragment的片段。我想从Screen1Fragment内部调用MyActivi 查看详情

从意图活动访问片段方法(代码片段)

...用setListener()。我正在使用意图启动新活动。我无法找到如何在新活动中获取片段实例或如何在片段中调用方法。任何帮助都会很棒!答案片段与活动紧密耦合。您始终需要创建活动作为片段的主机。来自documentation:片段表示活... 查看详情

从活动中调用片段方法

...ActionBar。在这个菜单中,每个选项都应该调用FragmentView1中的方法来更新它。但我真 查看详情

如何从android中的父活动修改片段的文本视图

】如何从android中的父活动修改片段的文本视图【英文标题】:Howtomodifyatextviewofthefragmentfromparentactivityinandroid【发布时间】:2016-10-2623:21:54【问题描述】:在我的活动中,我创建了一些片段publicclassMainActivityextendsAppCompatActivityimplem... 查看详情

如何使用菜单按钮将数据从活动传递到android中的片段?

】如何使用菜单按钮将数据从活动传递到android中的片段?【英文标题】:Howtopassdatafromactivitytofragmentinandroidusingmenubutton?【发布时间】:2020-07-2011:59:03【问题描述】:我有这些活动:登录活动主活动个人资料活动MainActivity包含4个... 查看详情

如何将数据从一个活动传递到android中的另一个活动片段? [复制]

】如何将数据从一个活动传递到android中的另一个活动片段?[复制]【英文标题】:Howtopassdatafromoneactivitytootheractivityfragmentinandroid?[duplicate]【发布时间】:2018-04-2306:52:40【问题描述】:我已经将一些键和值数据从一个活动传递到另... 查看详情

从片段中调用父母的活动

...】:2012-12-3012:40:31【问题描述】:如果我在Fragment中,我如何调用父母的活动?【问题讨论】:通过调用getActivity()只需调用getActivity();我做到了。但方法仍然不可见。你应该使用requireActivity()而不是getActivity()【参考方案1】:是的... 查看详情

Android:从片段调用活动

】Android:从片段调用活动【英文标题】:Android:CallingActivityfromFragment【发布时间】:2012-09-2004:50:42【问题描述】:我在活动中使用片段。我正在使用MediaRecorder进行录音。我有一个活动的两个部分。第一个本身将列出记录文件的... 查看详情

如何从android中的非Activity类调用服务方法

】如何从android中的非Activity类调用服务方法【英文标题】:howtocallaservicemethodfromanon-Activityclassinandroid【发布时间】:2013-08-2319:24:48【问题描述】:我看到了这个关于如何绑定服务并从Activity调用其方法的示例。http://developer.android.... 查看详情

如何使用单击事件和意图将当前日期从一个活动传递到android中的下一个活动(代码片段)

如何使用点击事件和意图将当前日期从一个活动传递到下一个活动(将当前日期传递给soap服务)答案Fromthecurrentactivity:Intentintent=newIntent(this,NextActivity.class);intent.putExtra("date",dateObj.getTime());startActivity(intent);Fromnextactivity:D 查看详情