- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
当我在 Android Studio 上创建一个空 fragment 时,它会生成以下代码:
/**
* A simple {@link Fragment} subclass.
* Activities that contain this fragment must implement the
* {@link TestFragment.OnFragmentInteractionListener} interface
* to handle interaction events.
* Use the {@link TestFragment#newInstance} factory method to
* create an instance of this fragment.
*/
public class TestFragment extends Fragment {
// TODO: Rename parameter arguments, choose names that match
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
private static final String ARG_PARAM1 = "param1";
private static final String ARG_PARAM2 = "param2";
// TODO: Rename and change types of parameters
private String mParam1;
private String mParam2;
private OnFragmentInteractionListener mListener;
public TestFragment() {
// Required empty public constructor
}
/**
* Use this factory method to create a new instance of
* this fragment using the provided parameters.
*
* @param param1 Parameter 1.
* @param param2 Parameter 2.
* @return A new instance of fragment TestFragment.
*/
// TODO: Rename and change types and number of parameters
public static TestFragment newInstance(String param1, String param2) {
TestFragment fragment = new TestFragment();
Bundle args = new Bundle();
args.putString(ARG_PARAM1, param1);
args.putString(ARG_PARAM2, param2);
fragment.setArguments(args);
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
mParam1 = getArguments().getString(ARG_PARAM1);
mParam2 = getArguments().getString(ARG_PARAM2);
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_test, container, false);
}
// TODO: Rename method, update argument and hook method into UI event
public void onButtonPressed(Uri uri) {
if (mListener != null) {
mListener.onFragmentInteraction(uri);
}
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
if (context instanceof OnFragmentInteractionListener) {
mListener = (OnFragmentInteractionListener) context;
} else {
throw new RuntimeException(context.toString()
+ " must implement OnFragmentInteractionListener");
}
}
@Override
public void onDetach() {
super.onDetach();
mListener = null;
}
/**
* This interface must be implemented by activities that contain this
* fragment to allow an interaction in this fragment to be communicated
* to the activity and potentially other fragments contained in that
* activity.
* <p>
* See the Android Training lesson <a href=
* "http://developer.android.com/training/basics/fragments/communicating.html"
* >Communicating with Other Fragments</a> for more information.
*/
public interface OnFragmentInteractionListener {
// TODO: Update argument type and name
void onFragmentInteraction(Uri uri);
}
}
对于一个空 fragment 来说,这是相当复杂的。创建的每个部分的目的是什么,我可以删除一些代码以使其“更简单”吗?什么是不必要的?因为当我创建一个空 Activity 时,它更“干净”
最佳答案
can I remove some of the code to make it "simpler"? What's not necessary?
您实际上可以删除所有代码。唯一真正必要的部分是类定义本身:
public class TestFragment extends Fragment {
}
您甚至不需要“必需的空公共(public)构造函数”,因为编译器会为您添加它。您永远不应该手动指定构造函数(除了在这个问题范围之外的非常狭窄的情况下)。
当然,大多数您使用 fragment 的时候,您将使用它们向用户显示信息,在这种情况下您需要包含 onCreateView()
方法:
public class TestFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_test, container, false);
}
}
此方法负责创建 fragment 的 View 。您不需要扩充 View (您可以手动制作并返回它),但是如果您希望用户看到任何内容,您确实必须返回一些非空 View 。以后可以通过调用 getView()
检索从此方法返回的任何内容。
请注意,使用没有 View 的 fragment 是完全有效的(例如 retained fragment used only as a container for long-running tasks )。
另一个与 fragment 有关的常见事情是使用 onAttach()
和 onDetach()
将承载 fragment 的 Activity 转换到某个 interface
.这使得 fragment 类可以与多个宿主 Activity 一起使用,只要每个 Activity 都实现接口(interface)即可。
public class TestFragment extends Fragment {
private MyListenerInterface mListener;
@Override
public void onAttach(Context context) {
super.onAttach(context);
this.mListener = (MyListenerInterface) context;
}
@Override
public void onDetach() {
super.onDetach();
this.mListener = null;
}
public interface MyListenerInterface {
void someMethod();
}
}
您可以直接转换上下文,而无需在生成的代码中包含 if
语句,因为无论哪种方式,您都会抛出运行时异常(您只会得到一个 ClassCastException
代替)。
您可以在此接口(interface)中定义您需要的任何方法。
最后,生成的 fragment 演示了用于向 fragment “传递参数”的 newInstance()
模式。如前所述,您永远不应该对 fragment 使用构造函数,那么您如何向它们传递数据呢?您可以使用“参数”Bundle
,将其设置为 fragment ,然后使用 getArguments()
检索数据。
每次都手动执行这些操作会很烦人,因此您可以将其全部包装在 newInstance()
静态工厂方法中以简化操作:
public class TestFragment extends Fragment {
private static final String ARG_PARAM1 = "param1";
private static final String ARG_PARAM2 = "param2";
private String mParam1;
private String mParam2;
public static TestFragment newInstance(String param1, String param2) {
Bundle args = new Bundle();
args.putString(ARG_PARAM1, param1);
args.putString(ARG_PARAM2, param2);
TestFragment fragment = new TestFragment();
fragment.setArguments(args);
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.mParam1 = getArguments().getString(ARG_PARAM1);
this.mParam2 = getArguments().getString(ARG_PARAM2);
}
}
有了这个,任何需要创建这个 fragment 实例的人都可以调用
TestFragment f = TestFragment.newInstance("Hello", "world");
不必写:
TestFragment f = new TestFragment();
Bundle args = new Bundle();
args.putString("param1", "Hello");
args.putString("param2", "world");
f.setArguments(args);
Bundle
类可以处理许多不同类型的数据;此示例使用字符串,但您可以使用整数或列表等。我从 onCreate()
中删除了 if
检查,因为我们知道参数包将始终为非空,因此检查无用。让它不为非空的唯一方法是如果有人不调用 newInstance()
,我们最好崩溃并解决这个问题,而不是尝试在没有我们需要的数据的情况下继续作战。
您可以从任何方法调用 getArguments()
,而不仅仅是 onCreate()
。
关于android - 我可以删除什么以使空 fragment 看起来 "cleaner",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54007823/
我已经为使用 JGroups 编写了简单的测试。有两个像这样的简单应用程序 import org.jgroups.*; import org.jgroups.conf.ConfiguratorFact
我有一个通过 ajax 检索的 json 编码数据集。我尝试检索的一些数据点将返回 null 或空。 但是,我不希望将那些 null 或空值显示给最终用户,或传递给其他函数。 我现在正在做的是检查
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: Why does one often see “null != variable” instead of “
嗨在我们公司,他们遵循与空值进行比较的严格规则。当我编码 if(variable!=null) 在代码审查中,我收到了对此的评论,将其更改为 if(null!=variable)。上面的代码对性能有影
我正在尝试使用 native Cordova QR 扫描仪插件编译项目,但是我不断收到此错误。据我了解,这是代码编写方式的问题,它向构造函数发送了错误的值,或者根本就没有找到构造函数。那么我该如何解决
我在装有 Java 1.8 的 Windows 10 上使用 Apache Nutch 1.14。我已按照 https://wiki.apache.org/nutch/NutchTutorial 中提
这个问题已经有答案了: 已关闭11 年前。 Possible Duplicate: what is “=null” and “ IS NULL” Is there any difference bet
Three-EyedRaven 内网渗透初期,我们都希望可以豪无遗漏的尽最大可能打开目标内网攻击面,故,设计该工具的初衷是解决某些工具内网探测速率慢、运行卡死、服务爆破误报率高以及socks流
我想在Scala中像在Java中那样做: public void recv(String from) { recv(from, null); } public void recv(String
我正在尝试从一组图像补丁中创建一个密码本。我已将图像(Caltech 101)分成20 X 20图像块。我想为每个补丁创建一个SIFT描述符。但是对于某些图像补丁,它不返回任何描述符/关键点。我尝试使
我在验证器类中自动连接的两个服务有问题。这些服务工作正常,因为在我的 Controller 中是自动连接的。我有一个 applicationContext.xml 文件和 MyApp-servlet.
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 已关闭10 年前。 问题必须表现出对要解决的问题的最低程度的了解。告诉我们您尝试过做什么,为什么不起作用,以
大家好,我正在对数据库进行正常的选择,但是 mysql_num_rowsis 为空,我不知道为什么,我有 7 行选择。 如果您发现问题,请告诉我。 真的谢谢。 代码如下: function get_b
我想以以下格式创建一个字符串:id[]=%@&stringdata[]=%@&id[]=%@&stringdata[]=%@&id[]=%@&stringdata[]=%@&等,在for循环中,我得到
我正在尝试使用以下代码将URL转换为字符串: NSURL *urlOfOpenedFile = _service.myURLRequest.URL; NSString *fileThatWasOpen
我正在尝试将NSNumber传递到正在工作的UInt32中。然后,我试图将UInt32填充到NSData对象中。但是,这在这里变得有些时髦... 当我尝试将NSData对象中的内容写成它返回的字符串(
我正在进行身份验证并收到空 cookie。我想存储这个 cookie,但服务器没有返回给我 cookie。但响应代码是 200 ok。 httpConn.setRequestProperty(
我认为 Button bTutorial1 = (Button) findViewById(R.layout.tutorial1); bTutorial1.setOnClickListener
我的 Controller 中有这样的东西: model.attribute("hiringManagerMap",hiringManagerMap); 我正在访问此 hiringManagerMap
我想知道如何以正确的方式清空列表。在 div 中有一个列表然后清空 div 或列表更好吗? 我知道这是一个蹩脚的问题,但请帮助我理解这个 empty() 函数:) 案例)如果我运行这个脚本会发生什么:
我是一名优秀的程序员,十分优秀!