【问题标题】:How to access Activity Variables from a fragment Android如何从片段 Android 访问活动变量
【发布时间】:2012-10-15 13:04:36
【问题描述】:

在我的活动中:

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

【问题讨论】:

  • my 2 cents: static Context field is bad, mkay ... and name convetion ...尽量不要在类名中只使用小写字母 'tabsmain' => 'TabsMain' ...可以命名 var(例如:TabsMain tabsmain = null;)但是当你想像在 David M 回答中那样使用这个类时,很难知道 tabsmain 是类名还是 var ...看看 Android SDK 类,它们总是使用第一个上层的 java 类
  • 我希望自从您发布此内容以来,您已经使用过一两个变量命名约定 :)
  • 我同意塞尔文的观点。 Java 世界非常注重命名约定。请参阅javatpoint.com/java-naming-conventions。感谢您的回答。

标签: java android android-activity fragment


【解决方案1】:

制作一个通用的结果接收器

您可以为此任务创建一个接口,该接口将从任何 Activity 获取字符串数据到您的 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();

【讨论】:

  • 这是最好和最安全的方法,应该是公认的答案。其他答案不遵循 android 指南,其中指出“片段旨在可重复使用,并且必须将 getActivity 强制转换为特定的活动类是一种不好的做法,因为它限制了它对该活动的使用并且会抛出任何 NPE其他”。
  • 很好的回应!问题一:不需要tabsmain Activity添加“Implements MyResultReceiver”来实现吗?因为它实际上定义了 getResult() 方法,但是如果接口没有实现,我不明白为什么会说 @Override ......我只是问因为我正在学习 Java,我不确定它是否正确我是说。
  • 是的,活动应该实现它。很好的捕捉@FerB。更新了我的代码
【解决方案2】:

解决方案:你可以试试这个。

在tabquests Fragment中使用这个,

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

【讨论】:

    【解决方案3】:

    如果你使用的是Java,你可以使用

    ((YourActivityName)getActivity()).variableName
    

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

    (activity as YourActivityName).variableName
    

    如果变量在 kotlin 中被定义为 null,你也必须尝试这些方法:-

    (activity as? YourActivityName).variableName
    
    (activity as? YourActivityName)!!.variableName
    

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

    为您选择正确的!

    希望,它会有所帮助。

    【讨论】:

      【解决方案4】:

      请注意,您的片段在活动之前加载。所以,你必须打电话给

      tabsmain tabsm=(tabsmain) getActivity();
      

      onActivityCreated() 方法中的行

      【讨论】:

        【解决方案5】:

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

        MainActvity.java

        public static boolean lf_ch=false;
        

        tabquestsFragment.java

        boolean if_value=MainActvity.lf_ch;
        

        希望对你有帮助

        【讨论】:

          【解决方案6】:

          获取片段中的 Activity 值。

          ((MainActivity) getActivity()).mGoogleApiClient;

          【讨论】:

            【解决方案7】:

            试试这样的:

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

            【讨论】:

            • 如果您希望从活动的布局中获取视图,这将起作用。
            【解决方案8】:

            我知道这是一个老问题,但是这里有一个简单的答案,无需跳过任何环节。在您的片段中定义一个变量,该变量是片段将在其中的活动,然后在 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
            

            【讨论】:

            • 没问题。乐意效劳。如果不是因为我在这里得到的帮助,我永远不会完成任何项目。只是想我会回馈,因为我可以。
            • ……太真实了! :D ...向 stackoverflow 团队和每一个花时间回馈社区的人竖起大拇指! :D
            • 我一直在使用相同的方法,它似乎工作正常。但是当我看到很多建议在活动和片段之间使用接口时,我一直想知道这样做是否真的“可以”,因为我知道我的片段真的只能与那个活动一起使用。跨度>
            • 我在应用商店里有一个使用这种方法的应用。该应用程序已经存在一年了,我没有看到以这种方式导致的失败。与您的一样,我的片段用于一项活动。我想如果您想使用具有多个活动的片段,或者反之亦然,使用接口将是可行的方法,实际上要这样做,您必须确切知道片段所在的活动。如果您尝试使用这种方法将一个片段放入多个活动中是行不通的。
            【解决方案9】:

            从 Activity 获取数据的另一种方法是通过以下方式访问 Activity 的 Intent:

            getActivity.getIntent().getExtras();
            

            等等

            如果您在 xml 中使用片段启动活动,并且希望以某种方式控制片段的 onCreate() 行为,这将很有用。

            PS:当然你应该先把一些东西放在意图上

            【讨论】:

              【解决方案10】:

              你可以试试下面的方法:

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

              【讨论】:

                【解决方案11】:

                改变: public boolean lf_ch=false; 至:public static boolean lf_ch=false; 您可以通过以下方式访问/更改该值:tabsmain.lf_ch

                【讨论】:

                • 不要只将变量从非静态切换到静态,只有正当理由。
                【解决方案12】:

                试试这个

                public boolean lf_ch=false;
                public class tabsmain extends Activity{
                
                    public static Context appContext;
                    public void onCreate(Bundle savedInstanceState){
                

                【讨论】:

                • 我不确定我是否遵循。如果 lf_ch 不在 tabsmain 类中,它在哪里?
                【解决方案13】:

                试试这个:

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

                【讨论】:

                • 这只会帮助读取对象 xxx 的变量。但是,如果我想在另一个片段中读取相同的变量,它将无法正常工作。
                • 我也可以更改它。改进:你可以直接改成tabsmain.lf_ch 你可以改成tabsmain.lf_ch=new_value
                【解决方案14】:

                尝试tabsmain.appContext.lf_ch 会给你那个变量的值。

                也在那个活动集中appContext = this

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2020-07-11
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多