【问题标题】:Activity-Fragment Method CommunicationActivity-Fragment 方法通信
【发布时间】: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.感谢您的帮助!

标签: java android android-activity fragment communication


【解决方案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); 
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多