Java 在静态方法中访问getActivity()
我这里有一个类,它调用方法setPointJava 在静态方法中访问getActivity(),java,android,android-fragments,android-fragmentactivity,Java,Android,Android Fragments,Android Fragmentactivity,我这里有一个类,它调用方法setPoint public class PointsList extends Fragment { public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment View
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();
不能从静态上下文引用,我不知道如何使静态类成为非静态类?我在静态类中使用了一些全局标志(有两个),这会让导出有些痛苦
public class PointCreation(int something) extends Fragment
是我不能做的事。您可以从视图中获取活动:
Activity activity = (Activity)view.getContext()
如果您使用FragmentActivity(看起来是这样),那么将上下文强制转换为FragmentActivity(而不是常规活动),然后您将能够调用getSupportFragmentManager()
不能从静态对象引用到非静态对象。首先,我想到的是对片段使用单例模式。换句话说,向您添加片段单例代码段:
static PointsList instance;
public PointsList getInstace(){
if(instance == null){
instance = new PointsList ();
}
return instance;
}
在fragmentonCreate
方法中,将其分配给实例:
instance = this;
之后,您可以从设置点方法中删除静态修饰符。并从项目的任何部分调用它,如PointsList.getInstance().setPoint()代码>
p、 你必须使用静态的哪些目标?您应该非常小心地使用static
,很多事情都可以通过单例而不是使用static来完成。您可以通过下面的代码来使用
private static FragmentActivity myContext;
@Override
public void onAttach(Activity activity) {
myContext = (FragmentActivity) activity;
super.onAttach(activity);
}
您可以使用myContext
作为Context使您的方法成为非静态的,将其作为活动或上下文或任何需要的参数传递给它,或者静态缓存一个singleton
实例,您可以根据需要获取该实例。但请记住,您不仅需要拥有对象,还必须在实际适当的时间调用它,可能是从适当的线程调用它,等等。已经使所有内容都非静态,它现在像charmthen activity一样工作。??activity Fragment Fragment=new PointsList();Activity=(Activity)view.getContext();FragmentManager FragmentManager=activity.getFragmentManager();不能从静态方法调用上下文。你将如何获得这种背景并不重要。你就是做不到that@OFFmind为什么我不能使用传递给方法的视图中的上下文?如果直接传递给该方法,当然可以。我的意思是你不能从静态方法中得到它。但是,对于只有静态方法的UTIL类来说,这是一个很好的实践,因为您不需要有此类类的实例。在您的情况下-您的片段将在任何情况下创建。所以使用singleton更可取。它帮助了我,谢谢:)
private static FragmentActivity myContext;
@Override
public void onAttach(Activity activity) {
myContext = (FragmentActivity) activity;
super.onAttach(activity);
}