我在Android Fragments开发指南中看到,“活动可以通过使用findFragmentById()
或从FragmentManager获取对Fragment的引用来调用片段中的方法findFragmentByTag()
。”
下面的示例显示如何获取片段引用,而不显示如何调用片段中的特定方法。
谁能举例说明如何做到这一点?我想在父Activity的Fragment中调用特定方法。谢谢。
我在Android Fragments开发指南中看到,“活动可以通过使用findFragmentById()
或从FragmentManager获取对Fragment的引用来调用片段中的方法findFragmentByTag()
。”
下面的示例显示如何获取片段引用,而不显示如何调用片段中的特定方法。
谁能举例说明如何做到这一点?我想在父Activity的Fragment中调用特定方法。谢谢。
Answers:
由于太简单而无法完全得到问题:
ExampleFragment fragment = (ExampleFragment) getFragmentManager().findFragmentById(R.id.example_fragment);
fragment.<specific_function_name>();
更新: 对于那些正在使用Kotlin的人
var fragment = supportFragmentManager.findFragmentById(R.id.frameLayoutCW) as WebViewFragment
fragment.callAboutUsActivity()
如果您使用的是“ 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();
从片段到活动:
((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");
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
您也可以这样做。
您也可以使用类似接口的片段方法
首先创建界面
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();
}
});
}
}