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

Syn*_*ror 50 java android fragment android-activity

在我的活动中:

public class tabsmain extends Activity{
    public static Context appContext;

    public boolean lf_ch=false;

    public void onCreate(Bundle savedInstanceState){
Run Code Online (Sandbox Code Playgroud)

我想访问并可能从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);
Run Code Online (Sandbox Code Playgroud)

但是,我似乎无法访问lf_ch的值.

小智 60

试试这个:

public View onCreateView(...){
  tabsmain xxx = (tabsmain)getActivity();
  lc.setChecked(xxx.lf_ch);
}
Run Code Online (Sandbox Code Playgroud)


Mar*_*ail 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
Run Code Online (Sandbox Code Playgroud)

  • ...如此真实!:D ...赞成stackoverflow团队和每个花时间回馈社区的人!:d (3认同)
  • 我在应用商店中有一个使用这种方法的应用。该应用程序已经存在一年了,我没有看到因这样做而导致的故障。和你的一样,我的片段用于一项活动。我想如果您想使用具有多个活动的片段或反之亦然使用界面将是可行的方法,实际上要这样做,您必须确切地知道片段所在的活动。如果您尝试使用这种方法将一个片段放入多个活动中,它将不起作用。 (2认同)

小智 17

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

((YourActivityName)getActivity()).variableName
Run Code Online (Sandbox Code Playgroud)

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

(activity as YourActivityName).variableName
Run Code Online (Sandbox Code Playgroud)

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

(activity as? YourActivityName).variableName

(activity as? YourActivityName)!!.variableName
Run Code Online (Sandbox Code Playgroud)

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

选择适合您的一款!

希望,它会有所帮助。


小智 5

取片段中的 Activity 值。

((MainActivity) getActivity()).mGoogleApiClient;


Roh*_*ngh 5

制作一个通用的 Result 接收器

在此处输入图片说明

您可以为此任务创建一个接口,该接口将从任何活动中获取字符串数据到您的 Fragment。按着这些次序。

创建接口

public interface MyResultReceiver{

      public String getResult();     

} 
Run Code Online (Sandbox Code Playgroud)

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

     }

}
Run Code Online (Sandbox Code Playgroud)

MyResultReceiver在Activity中实现并覆盖方法

public class tabsmain extends Activity implements MyResultReceiver{

        public boolean lf_ch=false;

        // Activity code


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

 }
Run Code Online (Sandbox Code Playgroud)

免责声明:

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

提示:为了能够获取任何类型的数据,将接口中的方法定义
public String getResult(); 更改为 public Object getResult();

  • 这是最好、最安全的方法,应该是公认的答案。其他答案不遵循 android 指南,该指南指出“片段是可重用的,并且必须将 `getActivity` 强制转换为特定的活动类是一种不好的做法,因为它限制了它对该活动的使用,并且会抛出任何 NPE其他”。 (3认同)