活动片段方法通信

a2mppw5e  于 2021-07-12  发布在  Java
关注(0)|答案(1)|浏览(464)

主要活动有2个片段(片段A和片段B)。fragmenta有一个文本视图,fragmentb有另一个活动(活动)。gymactivity有一个按钮,当单击时,它应该将textview隐藏在fragmenta中!
我试着用下面的方法做这个,但是没有用!它只在textview处于fragmentb中时工作。
主活动.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;
     } 
 }

现在在健身活动中

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中,则此代码正常工作!但我必须隐藏文本视图,它是在碎片。那该怎么办呢?

vyu0f0g1

vyu0f0g11#

所以,首先。不要在静态变量中保存活动或片段。如果内存泄漏,可能会发生这种情况。
那么,你的 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 (片段生命周期)

public void onResume() {
    super.onResume();

    txtview.setVisibility(SomeData.getInstance().isHide() ? View.GONE : View.VISIBLE); 
}

相关问题