我在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();
}