如何从Android片段访问活动变量

时间:2012-10-25 10:54:27

标签: java android android-activity fragment

在我的活动中:

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的值。

14 个答案:

答案 0 :(得分:57)

试试这个:

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

答案 1 :(得分:22)

我知道这是一个老问题,但是这里有一个简单的答案,可以在不跳过任何环节的情况下工作。在你片段中,定义一个变量,该变量是片段将在onCreateView中的Activity,将变量连接到活动,然后你有一个可以获取主活动中任何公共变量的引用。当我到这里时,我已经忘记了它。由于您需要找到显示的确切片段,因此执行其他方式有点困难。但是,你不应该以另一种方式去做,因为你可以轻松地来回传递信息。我希望这可以帮助遇到它的任何人。

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

答案 2 :(得分:11)

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

((YourActivityName)getActivity()).variableName

访问,如果您使用的是Kotlin,则可以使用

(activity as YourActivityName).variableName

如果在kotlin中将变量定义为null,则还必须尝试以下每种方法:-

(activity as? YourActivityName).variableName

(activity as? YourActivityName)!!.variableName

,或者如果可能,必须使用let块。

为您选择正确的一个!

希望,会有所帮助。

答案 3 :(得分:4)

在片段中获取活动值。

(((MainActivity)getActivity())。mGoogleApiClient;

答案 4 :(得分:2)

从活动中获取数据的另一种方法是通过以下方式访问活动的意图:

getActivity.getIntent().getExtras();

等等。

如果你在xml中使用片段启动活动,并希望以某种方式控制片段的onCreate()行为,那么它会非常有用。

PS:因为你应该首先提出意图

答案 5 :(得分:0)

尝试tabsmain.appContext.lf_ch会给出该变量的值。

同样在该活动中设置appContext = this

答案 6 :(得分:0)

试试这个

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

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

答案 7 :(得分:0)

您可以尝试以下方法:

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

答案 8 :(得分:0)

尝试这样的事情:

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

答案 9 :(得分:0)

成为通用结果接收器

enter image description here

您可以为此任务创建一个接口,该接口将从任何Activity到您的Fragment中获取String数据。请按照下列步骤。

创建界面

public interface MyResultReceiver{

      public String getResult();     

} 

使MyResultReceiver为您的片段成员

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);

     }

}

在“活动”中实施MyResultReceiver并覆盖方法

public class tabsmain extends Activity{

        public boolean lf_ch=false;

        // Activity code


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

 }

免责声明:

在这种情况下,您可能会发现它有点冗长。但是这种方法的优点是,如果您想将此代码重用于其他活动。您将不必再次编写相同的逻辑。只需在您的活动中实现MyResultReceiver,重写该方法,您就可以进行了。

提示:要获取任何类型的数据,请在界面中更改方法定义
public String getResult(); public Object getResult();

答案 10 :(得分:0)

访问片段中的Activity变量以使用静态关键字,如下所示:

MainActvity.java

public static boolean lf_ch=false;

tabquestsFragment.java

boolean if_value=MainActvity.lf_ch;

希望对您有帮助

答案 11 :(得分:0)

请注意,您的片段在活动之前加载。因此,您必须致电

tabsmain tabsm=(tabsmain) getActivity();

onActivityCreated()方法中的行

答案 12 :(得分:0)

解决方案:您可以尝试一下。

在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);
    }

答案 13 :(得分:-1)

变化: public boolean lf_ch=false;public static boolean lf_ch=false; 您可以使用以下代码访问/更改值:tabsmain.lf_ch