【问题标题】:I Can't Call Fragment Method from Activity我无法从活动中调用片段方法
【发布时间】:2018-08-21 19:14:18
【问题描述】:

我有一个活动。当我单击按钮时,我想在 Fragment 中运行该方法。但它不起作用。我尝试了很多方法,但都无法奏效。

我的活动;

public class MyActivity extends Activity {

Button button;
TabLayout tabLayout;

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

    tabLayout = (TabLayout) findViewById(R.id.tab_layout);
    tabLayout.addTab(tabLayout.newTab().setText("First"));
    tabLayout.addTab(tabLayout.newTab().setText("Second"));

    viewPager= (CustomViewPager) findViewById(R.id.pager);
    final PagerAdapter adapter = new MyFragmentAdapter(getSupportFragmentManager(),tabLayout.getTabCount());
    viewPager.setAdapter(adapter);
    viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));
    tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {

        @Override
        public void onTabSelected(TabLayout.Tab tab) {
            viewPager.setCurrentItem(tab.getPosition());
            }
            @Override
            public void onTabUnselected(TabLayout.Tab tab) {
            }
            @Override
            public void onTabReselected(TabLayout.Tab tab) {
            }
    });        

    button = (Button)findViewById(R.id.button);
    button .setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            MyFragment firstfragment = (MyFragment ) getFragmentManager().findFragmentByTag(“tab1”); 

            firstfragment.MyMethod();
        }
    });
    }
}

我的片段适配器

import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import com.webviewapp.Fragment.PromotionFragment;
import com.webviewapp.Fragment.WebFragment;

public class MyFragmentAdapter extends FragmentPagerAdapter {

int tabCount;

public MyFragmentAdapter(FragmentManager fm, int numberOfTabs) {
    super(fm);
    this.tabCount = numberOfTabs;
}

@Override
public Fragment getItem(int position) {

    switch (position) {
        case 0:
            FirstFragment tab1 = new FirstFragment ();
            return tab1;
        case 1:
            SecondFragment tab2 = new SecondFragment ();
            return tab2;
        default:
            return null;
    }
}

@Override
public int getCount() {
    return tabCount;
}
}

第一个片段

 public class FirstFragmentextends Fragment {

 Button fragmentbutton;

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


@SuppressLint("SetJavaScriptEnabled")
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View view = inflater.inflate(R.layout.fragment_web, container, false);

    fragmentbutton = (Button) view.findByViewId(R.id.fragmentbutton );
}

 public void MyMethod(){

   fragmentbutton.setVisibility(View.GONE);
}

}

很抱歉造成混乱。我想要做的是在我按下 Activity 中的按钮时运行 MyMethod。 MyMethod 是片段中的一个特殊方法。对于一开始无法添加代码,我再次道歉。

【问题讨论】:

  • 您确定要在 onclick 中创建片段的新实例吗?该方法应该做什么?如果你想看到它的内容,你需要以某种方式显示片段
  • @Isa,如果不加载片段,您不能仅通过它的对象调用方法。您是否在活动中加载了片段。如果是,请显示代码。
  • @StarterPack 我真的不想创建一个新片段。单击按钮时,我想访问片段。片段内的对象就足够了。我无法运行任何东西。
  • @UmangBurman 我试图将我的代码的相关部分添加到图片中。请检查。
  • “不起作用”不是有用的问题描述。请具体。

标签: java android android-studio


【解决方案1】:

如果你想从 FirstFragment 调用一个方法

FirstFragment firstFragment = (FirstFragment) getSupportFragmentManager().getFragments().get(0);
firstFragment.MyMethod();

如果你想从 SecondFragment 调用一个方法

SecondFragment secondFragment = (SecondFragment) getSupportFragmentManager().getFragments().get(1);
secondFragment.MyMethod();

索引 0 或 1 基于适配器的 getItem 方法中的位置。

@Override
public Fragment getItem(int position) {

    switch (position) {
        case 0:
            FirstFragment tab1 = new FirstFragment();
            return tab1;
        case 1:
            SecondFragment tab2 = new SecondFragment();
            return tab2;
        default:
            return null;
    }
}

那就试试吧。

【讨论】:

    【解决方案2】:

    您使用 FragmentManager 来获取片段的句柄。 您正在代码中创建 Fragment 的新实例:

    final FirstFragment firstfragment= new FirstFragment ();
    

    新对象未绑定到任何活动。

    FragmentManager

    【讨论】:

    • 我用过这个,但不起作用。 WebFragment = (WebFragment) getFragmentManager().findFragmentByTag(“tab1”);
    • 您缺乏代码对人们没有帮助。显示完整的活动和片段类。
    • 请检查。我终于可以补充了。
    【解决方案3】:

    回答问题为时已晚,但这是获取片段实例和调用片段中的方法的简单方法;您必须获取片段的实例,然后调用您的公共方法:

    在您的片段中:

     private static yourFragment instance;
    

    然后在你的片段的 onCreateView 中:

     @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, 
       Bundle savedInstanceState) {
    
            instance= this;
    
            View v = inflater.inflate(R.layout.fragment_tools, container, false);
            binding = FragmentToolsBinding.inflate(inflater, container, false);
    
            return v;
        }
    

    而且在你的片段中,你必须有一个返回实例的静态方法:

    public static yourFragment GetInstance()
    {
        return instance;
    }
    

    那么你的片段中有一个公共方法,你想像这样调用它:

    public  void  theMethod()
    {
        Toast.makeText(getActivity(), "Test", Toast.LENGTH_SHORT).show();
    }
    

    然后您可以获取片段实例并像这样调用您的非静态公共方法:

    yourFragment 片段 = yourFragment.GetInstance(); frag.theMethod();

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-20
      • 2012-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-23
      相关资源
      最近更新 更多