【问题标题】:Access getActivity() inside static method在静态方法中访问 getActivity()
【发布时间】:2014-04-10 13:56:55
【问题描述】:

我这里有这个类,它调用 setPoint 方法

public class PointsList extends Fragment {    
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View view = inflater.inflate(R.layout.listpoints, container, false);

    public static class PointCreation extends Fragment {
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                         Bundle savedInstanceState) {

        View view = inflater.inflate(R.layout.point_creation, container, false);
        setPoint(view, CREATE);
        return view;
    }
}

static final void setPoint(View view, int goal) {
final EditText SerialField = (EditText) view.findViewById(R.id.Serial);
    if(goal == CREATE) {
        Button buttonGuardar = (Button) view.findViewById(R.id.buttonGuardar);
        buttonGuardar.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String Serial = SerialField.getText().toString();
                pointsList.add(new Serial);
                //go back to R.layout.listpoints
            }
        });
    }
}

我的目标是在单击按钮将新序列添加到列表后,我可以从

返回上一个菜单
R.layout.point_creation to R.layout.listpoints

为了在片段中移动,我通常使用这样的东西:

            Fragment fragment = new PointsList();
            FragmentManager fragmentManager = getActivity().getSupportFragmentManager();
            fragmentManager.beginTransaction()
                    .replace(R.id.container, fragment)
                    .commit();

但在里面:

static final void setPoint(View view, int goal)
getActivity().getSupportFragmentManager();

无法从静态上下文中引用,我不知道如何通过使静态类变为非静态来解决它?我有一些在静态类中使用的全局标志(其中有 2 个),因为导出会有点痛苦

public class PointCreation(int something) extends Fragment 

是我做不到的。

【问题讨论】:

  • 要么使您的方法成为非静态方法,将其传递给 Activity 或 Context 或任何它需要的参数,或者静态缓存 singleton 实例,您可以根据需要获取该实例。但是请记住,您不仅必须拥有对象,还必须在实际适当的时间调用它的方法,可能来自适当的线程等。
  • 已经让一切都变成了非静态的,现在它就像一个魅力一样工作

标签: java android android-fragments android-fragmentactivity


【解决方案1】:

您可以从视图中获取活动:

Activity activity = (Activity)view.getContext()

如果您使用 FragmentActivity(似乎是这样),则将 Context 转换为 FragmentActivity(而不是常规 Activity),然后您将能够调用 getSupportFragmentManager()

FragmentActivity activity = (FragmentActivity)view.getContext();
FragmentManager manager = activity.getSupportFragmentManager();

【讨论】:

  • 那么活动.??活动片段片段 = new PointsList();活动活动 = (活动)view.getContext(); FragmentManager fragmentManager = activity.getFragmentManager();
  • 你不能从静态方法调用上下文。你将如何获得这种背景并不重要。你就是做不到
  • @OFFmind 为什么我不能使用传递给方法的视图上下文?
  • 如果你直接将它传递给那个方法——当然可以。我的意思是你不能从静态方法中得到它。但是,对于只有静态方法的 Utils 类来说,这是一种很好的做法,因为您不需要拥有此类类的实例。在您的情况下 - 您的片段将在任何情况下创建。所以最好使用单例。
  • 它帮助了我,谢谢 :)
【解决方案2】:

您可以通过以下代码使用;

private static FragmentActivity myContext;

@Override
public void onAttach(Activity activity) {
    myContext = (FragmentActivity) activity;
    super.onAttach(activity);
}

您可以将myContext 用作Context

【讨论】:

    【解决方案3】:

    您不能从静态对象引用到非静态对象。首先,想到的是为您的片段使用单例模式。换句话说,给你添加片段单例 sn-p:

        static PointsList instance;
    
        public PointsList getInstace(){
         if(instance == null){
            instance = new PointsList ();
         }
        return instance;
        }
    

    并在您的片段onCreate 方法中将其分配给实例:

    instance = this;
    

    之后,您可以从 setPoint 方法中删除 static 修饰符。并从您项目的任何部分调用它,例如 PointsList.getInstance().setPoint();

    附言您必须使用静态的哪些目标?你应该非常小心地使用static,很多事情可以通过单例而不是使用静态来完成。

    【讨论】:

      猜你喜欢
      • 2016-09-16
      • 1970-01-01
      • 2018-05-30
      • 1970-01-01
      • 2015-10-21
      • 2015-07-22
      • 2012-06-29
      • 2017-01-13
      相关资源
      最近更新 更多