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】:

所以,首先。不要将活动或片段保存在静态变量中。这可能会发生内存泄漏。

然后,您的GymActivityMainActivity 永远不会在 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 方法通信的主要内容,如果未能解决你的问题,请参考以下文章

AIDL实现线程间通信

AEM 6.3,wcm.io:在@Act ivate方法中吊索MockResource null

官方模考?!ACT宣布启动PreACT考试

报错storage size of ‘act’ isn’t known当使用std=c99编译struct sigaction

adt的标准格式不含

如何在嵌套片段内的两个子片段之间进行通信