簡體   English   中英

如何從片段 Android 訪問活動變量

[英]How to access Activity Variables from a fragment Android

在活動中我有:

public class tabsmain extends Activity{
    public static Context appContext;

    public boolean lf_ch=false;

    public void onCreate(Bundle savedInstanceState){

我想從 tabsmain 中的片段訪問並可能更改 lf_ch;

public class tabquests extends Fragment{ 
    public CheckBox lc;
@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)//onCreateView
    { 
lc.setChecked(//set it to lf_ch);

但是,我似乎無法訪問 lf_ch 的值。

嘗試這個:

public View onCreateView(...){
  tabsmain xxx = (tabsmain)getActivity();
  lc.setChecked(xxx.lf_ch);
}

我知道這是一個老問題,但是這里有一個簡單的答案,無需跳過任何環節即可工作。 在您的片段中定義一個變量,該變量是片段所在的活動,然后在 onCreateView 中將變量連接到活動,然后您就有了一個可以訪問主活動中任何公共變量的引用。 當我結束這里時,我已經忘記了。 另一種方式有點困難,因為您需要找到正在顯示的確切片段。 但是,有了這個,您不需要以其他方式進行操作,因為您可以輕松地來回傳遞信息。 我希望這可以幫助任何遇到它的人。

public Quiz_Avtivity mainQuiz;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.fragment_quiz, container, false);

mainQuiz = (Quiz_Avtivity) getActivity();
//Below is where you get a variable from the main activity
mainQuiz.AnyPublicVariable = whatEver;
//also
whatEver = mainQuiz.AnyPublicVariable

如果您使用的是 Java,則可以使用

((YourActivityName)getActivity()).variableName

訪問,如果您使用的是 Kotlin,則可以使用

(activity as YourActivityName).variableName

如果變量在 kotlin 中定義為 null,則您還必須嘗試以下每種方法:-

(activity as? YourActivityName).variableName

(activity as? YourActivityName)!!.variableName

如果可能,或者必須使用 let 塊。

選擇適合您的一款!

希望,它會有所幫助。

取片段中的 Activity 值。

((MainActivity) getActivity()).mGoogleApiClient;

制作一個通用的 Result 接收器

在此處輸入圖片說明

您可以為此任務創建一個接口,該接口將從任何活動中獲取字符串數據到您的 Fragment。 按着這些次序。

創建接口

public interface MyResultReceiver{

      public String getResult();     

} 

使MyResultReceiver成為您的 Fragment 的成員

public class tabquests extends Fragment{ 

    public CheckBox lc;
    public MyResultReceiver resultreceiver;

    @Override
    public void onAttach(Context context){
         super.onAttach(cotext);
         resultreceiver = (MyResultReceiver)context;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)//onCreateView
    { 

           YourFragment code code

           Boolean result = resultreceiver.getResult();
           lc.setChecked(result);

     }

}

在Activity中實現MyResultReceiver並覆蓋方法

public class tabsmain extends Activity implements MyResultReceiver{

        public boolean lf_ch=false;

        // Activity code


        @Override
        public boolean getResult(){
             return lf_ch;
        }

 }

免責聲明:

對於這種情況,您可能會發現它有點冗長。 但是這種方法的優點是,如果您想將此代碼重用於另一個活動。 您將不必再次編寫相同的邏輯。 只需在您的活動中實現MyResultReceiver ,覆蓋該方法,您就可以開始了。

提示:為了能夠獲取任何類型的數據,更改接口中的方法定義
public String getResult(); public Object getResult();

從活動中獲取數據的另一種方法是通過以下方式訪問活動的意圖:

getActivity.getIntent().getExtras();

等等。

如果您使用 xml 中的片段啟動活動,並且想以某種方式控制片段的 onCreate() 行為,它會很有用。

PS:當然你應該首先把一些東西放在心上

您可以嘗試以下方法:

lc.setChecked(((yourpackagename)getActivity()).lf_ch);

試試tabsmain.appContext.lf_ch會給你那個變量的值。

同樣在該活動中設置appContext = this

嘗試這個

public boolean lf_ch=false;
public class tabsmain extends Activity{

    public static Context appContext;
    public void onCreate(Bundle savedInstanceState){

嘗試這樣的事情:

    ViewPager mViewPager = (ViewPager) getActivity().findViewById(R.id.m_view_pager);

訪問片段中的活動變量以使用靜態關鍵字,如下所示:

主活動.java

public static boolean lf_ch=false;

tabquestsFragment.java

boolean if_value=MainActvity.lf_ch;

我希望它能幫助你

請注意,您的片段在活動之前加載。 所以,你必須調用

tabsmain tabsm=(tabsmain) getActivity();

onActivityCreated()方法中的行

解決方案:你可以試試這個。

在 tabquests 片段中使用這個,

public class tabquests extends Fragment{ 
    private tabsmain tabsmainActivity;
    public CheckBox lc;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup 
         container,Bundle savedInstanceState)//onCreateView
    { 
        tabsmainActivity = (tabsmain)getActivity; //typecasting 
        //now you can access the variables of tabsmain activity and make 
        //sure you give them public access in the activity`
        tabsmainActivity.lf_ch; //or do whatever operation you want here.
        lc.setChecked(//set it to lf_ch);
    }

更改: public boolean lf_ch=false; 到: public static boolean lf_ch=false; 您可以訪問/更改值: tabsmain.lf_ch

暫無
暫無

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

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