Activity-Fragment 方法通信
Posted
技术标签:
【中文标题】Activity-Fragment 方法通信【英文标题】:Activity-Fragment Method Communication 【发布时间】:2021-07-18 08:30:37 【问题描述】:MainActivity 有 2 个 Fragment(FragmentA 和 FragmentB)。 FragmentA 有一个 TextView,而 FragmentB 有另一个 Activity(GymActivity)。 GymActivity 有一个 Button,单击时应该隐藏 FragmentA 中的 TextView!
我尝试通过以下方法执行此操作,但没有成功!仅当 TextView 在 FragmentB 中时才有效。
MainActivity.java
public class MainActivity extends AppCompatActivity
private static MainActivity instance;
@override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity.main);
instance = this;
public static MainActivity getInstance()
return instance;
public void myMethod()
// my method...
另一个类.java
public Class AnotherClass()
MainActivity.getInstance().myMethod();
这是我的代码!
片段 A
public class AFragment extends Fragment
TextView txtview;
private static AFragment instance;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState)
View view = inflater.inflate(R.layout.fragment_A, container, false);
txtview = view.findViewById(R.id.A_txt);
instance = this;
return view;
public static AFragment getInstance()
return instance;
public void myMethod()
txtview.setVisibility(View.GONE);
片段 B
public class BFragment extends Fragment
public CardView CvGym;
@Override
public View onCreateView(final LayoutInflater inflater, ViewGroup
container, Bundle savedInstanceState)
View view = inflater.inflate(R.layout.fragment_B, container, false);
CvGym = (CardView) view.findViewById(R.id.gym);
CvGym.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View view)
Intent intent = new Intent(getActivity(), GymActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivity(intent);
);
return view;
现在在 GymActivity
public class Gym extends AppCompatActivity
Button buttonX;
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_Gym);
buttonX = (Button)findViewById(R.id.btn_X);
getbtnX();
public Button getbtnX()
buttonX.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View view)
FragmentA.getInstance().myMethod();
);
return buttonX;
结论: 如果 TextView 在 FragmentB 中,则此代码可以正常工作!但我必须隐藏 FragmentA 中的 TextView。那么该怎么办呢?
【问题讨论】:
问题不清楚。什么有 FragmentB?片段包含一个活动??你想从哪里调用myMethod
,从 Fragment 还是 Activity?
@anatoli,在 FragmentB 里面有一个 Cardview 可以打开 GymActivity,在 GymActivity 里面有一个 Button。!并且 myMethod 将从 GymAvtivity 调用!!
为了更清楚,我将添加我的代码!
嗯?还是不明白。是的,请提供代码以查看确切的问题。并且无法同时看到 2 个活动。不明白为什么标题叫“Activity-Fragment Method Communication”
@anatoli 现在怎么样了?我已经添加了代码!好吧,我不知道给这个问题取什么标题,所以我只是添加了一个随机的标题,不要介意!! p.s.感谢您的帮助!
【参考方案1】:
所以,首先。不要将活动或片段保存在静态变量中。这可能会发生内存泄漏。
然后,您的GymActivity
和MainActivity
永远不会在 UI 中同时显示。那么隐藏某些视图的目的是什么,目前不再可见?
无论如何,要使其正常工作,您可以通过使用 SharedPreferences
来实现,在您的数据库中存储一些状态或最简单的解决方案 - 使用 POJO Singleton 对象。
public class SomeData
private static SomeData instance;
private boolean hide;
private SomeData()
public SomeData getIinstance()
if (instance == null)
instance = new SomeData();
public void setHide(boolean hide)
this.hide = hide;
public boolean isHide()
return hide;
那么您可以在GymActivity
中使用它。替换
FragmentA.getInstance().myMethod();
与
SomeData.getInstance().setHide(true);
一旦您的FragmentA
再次可见,您就可以签入onResume
(Fragment lifecycle)
public void onResume()
super.onResume();
txtview.setVisibility(SomeData.getInstance().isHide() ? View.GONE : View.VISIBLE);
【讨论】:
以上是关于Activity-Fragment 方法通信的主要内容,如果未能解决你的问题,请参考以下文章
AEM 6.3,wcm.io:在@Act ivate方法中吊索MockResource null
报错storage size of ‘act’ isn’t known当使用std=c99编译struct sigaction