![](/img/trans.png)
[英]Android - How to access a getter method in parent Activity from Fragment
[英]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;
您可以為此任務創建一個接口,該接口將從任何活動中獲取字符串數據到您的 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.