我在Android Fragments Dev GuidefindFragmentById()
中看到“活动可以通过从 FragmentManager 获取对 Fragment 的引用,使用or来调用片段中的方法findFragmentByTag()
。”
下面的示例展示了如何获取片段引用,但不展示如何调用片段中的特定方法。
谁能举例说明如何做到这一点?我想从父 Activity 调用 Fragment 中的特定方法。谢谢。
我在Android Fragments Dev GuidefindFragmentById()
中看到“活动可以通过从 FragmentManager 获取对 Fragment 的引用,使用or来调用片段中的方法findFragmentByTag()
。”
下面的示例展示了如何获取片段引用,但不展示如何调用片段中的特定方法。
谁能举例说明如何做到这一点?我想从父 Activity 调用 Fragment 中的特定方法。谢谢。
没有得到这个问题,因为它太简单了:
ExampleFragment fragment = (ExampleFragment) getFragmentManager().findFragmentById(R.id.example_fragment);
fragment.<specific_function_name>();
如果你使用“import android.app.Fragment;” 然后使用:
1)
ExampleFragment fragment = (ExampleFragment) getFragmentManager().findFragmentById(R.id.example_fragment);
fragment.specific_function_name();
其中 R.id.example_fragment 很可能是 xml 布局中的 FrameLayout id。或者
2)
ExampleFragment fragment = (ExampleFragment) getFragmentManager().findFragmentByTag(“FragTagName”);
fragment.specific_function_name();
其中 FragTagName 是您指定的名称:
TabHost mTabHost.newTabSpec(“FragTagName”)
如果您使用“import android.support.v4.app.Fragment;” 然后使用:
1)
ExampleFragment fragment = (ExampleFragment) getSupportFragmentManager().findFragmentById(R.id.example_fragment);
fragment.specific_function_name();
或者
2)
ExampleFragment fragment = (ExampleFragment) getSupportFragmentManager().findFragmentByTag(“FragTagName”);
fragment.specific_function_name();
如果您使用的是支持库,则需要执行以下操作:
FragmentManager manager = getSupportFragmentManager();
Fragment fragment = manager.findFragmentById(R.id.my_fragment);
fragment.myMethod();
((FragmentName) getFragmentManager().findFragmentById(R.id.fragment_id)).methodName();
2. 如果您使用的是支持库 Fragment,请执行以下操作:
((FragmentName) getSupportFragmentManager().findFragmentById(R.id.fragment_id)).methodName();
从片段到活动:
((YourActivityClassName)getActivity()).yourPublicMethod();
从活动到片段:
FragmentManager fm = getSupportFragmentManager();
//if you added fragment via layout xml
YourFragmentClass fragment =
(YourFragmentClass)fm.findFragmentById(R.id.your_fragment_id);
fragment.yourPublicMethod();
如果您通过代码添加片段并在添加片段时使用了标签字符串,请改用findFragmentByTag:
YourFragmentClass fragment = (YourFragmentClass)fm.findFragmentByTag("yourTag");
我认为最好是在调用片段中的方法之前检查是否添加了片段。做这样的事情来避免空异常。
ExampleFragment fragment = (ExampleFragment) getFragmentManager().findFragmentById(R.id.example_fragment);
if(fragment.isAdded()){
fragment.<specific_function_name>();
}
您还可以使用类似的接口调用片段方法
首先你创建界面
public interface InterfaceName {
void methodName();
}
创建接口后,您在片段中实现接口
MyFragment extends Fragment implements InterfaceName {
@overide
void methodName() {
}
}
并且您在活动中创建接口的引用
class Activityname extends AppCompatActivity {
Button click;
MyFragment fragment;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity);
click = findViewById(R.id.button);
fragment = new MyFragment();
click.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
fragment.methodName();
}
});
}
}
这个问题太迟了,但这是获取片段实例和调用片段中的方法的简单方法;您必须获取片段的实例,然后调用您的公共方法:
在您的片段中:
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 frag = yourFragment.GetInstance();
frag.theMethod();
首先你创建你fragment
喜欢的方法
public void name()
{
}
在你的activity
你添加这个
添加onCreate()
方法
myfragment fragment=new myfragment()
最后调用你想调用的方法添加这个
fragment.method_name();
试试这个代码
FragmentManager fm = getFragmentManager();
MainFragment frag = (MainFragment)fm.findFragmentById(R.id.main_fragment);
frag.<specific_function_name>();
我不知道Java
,但在C#
(Xamarin.Android) 中,每次需要调用该方法时都无需查找片段,见下文:
public class BrandActivity : Activity
{
MyFragment myFragment;
protected override void OnCreate(Bundle bundle)
{
// ...
myFragment = new MyFragment();
// ...
}
void someMethod()
{
myFragment.MyPublicMethod();
}
}
public class MyFragment : Android.Support.V4.App.Fragment
{
public override void OnCreate(Bundle bundle)
{
// ...
}
public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle bundle)
{
// ...
}
public void MyPublicMethod()
{
// ...
}
}
我认为Java
你也可以这样做。
((HomesFragment)getSupportFragmentManager().findFragmentById(R.id.fragment_container)).filterValidation();
这个问题为时已晚,但无论如何都会为任何仍然需要它的人发布我的答案。我找到了一种更简单的方法来实现这一点,而无需使用片段 ID 或片段标签,因为这正是我所寻求的。
首先,我在 ParentActivity 类中声明了我的 Fragment:
MyFragment myFragment;
像往常一样初始化我的 viewPager,使用我已经在上面的类中添加的片段。然后,在 myFragment 中创建了一个名为scrollToTop的公共方法,该方法执行我想要从 ParentActivity 执行的操作,假设将我的 recyclerview 滚动到顶部。
public void scrollToTop(){
mMainRecyclerView.smoothScrollToPosition(0);
}
现在,在 ParentActivity 我调用了如下方法:
try{
myFragment.scrollToTop();
}catch (Exception e){
e.printStackTrace();
}