簡體   English   中英

在另一個擴展類中從MainActivity訪問var

[英]Access var from MainActivity in another Extended class

因此,我需要從另一個類訪問MainActivty中的變量。 這樣做的最好方法是什么。 下面是場景,但是我不能調用frag.receiveInt(give_this_int_to_fragment);

MainActivity.java:

    import com.me.fragments.FragmentExtender

    public class MainActivity{
        int give_this_int_to_fragment;

        protected void onCreate(...){
            Fragment frag = new FragmentExtender();
            give_this_int_to_frag = new int();
            frag.receiveInt(give_this_int_to_frag);
        }
    }

FragmentExtender.java:

    public class FragmentExtender extends Fragment{
         int receive_int_from_main;

         public View onCreateView(...){...}

         receiveInt(int_from_main){
              receive_int_from_main = int_from_main;
         }
    }

我不是要創建重復的變量,而是在MainActivity中僅創建指向該變量的指針。

在Activity中為該變量創建getter和setter

public class MainActivity{
    int give_this_int_to_fragment;

    protected void onCreate(...){
        Fragment frag = new FragmentExtender();

    }
}

public int getgive_this_int_to_fragment(){
     return give_this_int_to_fragment;
}
public void getgive_this_int_to_fragment(int var){
     give_this_int_to_fragment = var;
}

現在,在片段中,您可以使用getActivity()獲取活動上下文,然后調用getter

public class FragmentExtender extends Fragment{


     public View onCreateView(...){
         //....
         int var = ((MainActivity) getActivity()).getgive_this_int_to_fragment();

     }
}

更為優雅的方法是在Fragment中實現一個接口並使應用程序從該接口繼承。 這樣,您就可以進行這種通信。

interface FragmentInterface{
    Object getMainValue();
    void passValueToMain(Object obj);
}

使用此代碼,您只需將其添加到MainActivity聲明和片段構造函數中

public class MainActivity implements FragmentInterface{
    int give_this_int_to_fragment;

    protected void onCreate(...){
        Fragment frag = new FragmentExtender();
        ....
    }
}

然后在片段中

public class FragmentExtender extends Fragment{
    private FragmentInterface mInterface;
    int receive_int_from_main;

    public View onCreateView(...){...}

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        setListeners(context);
    }

    //This is for pre Marshmallow versions
    @SuppressWarnings("deprecation")
    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);

        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
            setListeners(activity);
        }
    }

    private void setListeners(Object object) {
        if (object instanceof FragmentInterface) {
            mListener = (FragmentInterface) object;
        } else {
            throw new RuntimeException(object.toString()
                + " must implement FragmentInterface");
        }
    }
}

這將適用於任何片段以及實現它們的任何活動

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM