- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的应用程序有登录功能。登录成功后,您将导航到具有抽屉导航的应用程序的第一页,因此我的大部分屏幕都是 fragment ,而不是 Activity ,并且由 BaseActivity.java
调用。
我有 fragment AddShopFragment
,用户可以在其中添加有关商店的信息并保存它。在此 fragment 中,我有一个名为 moreinfo
的按钮。当您按下它时,您将导航到名为 AddMoreInfoForShopActivity
的 Activity 。此 Activity 有一个名为 lessinfo
的按钮,可将您导航到 BaseActivity
,然后此 Activity 将您和数据发送到 AddShopFragment
fragment 。
到目前为止,我成功地使用来自 Activity 和 fragment 的数据来保存商店。因此,我可以在 Activity 之间交换这些信息以获取更多数据 - BaseActivity - 保存数据的 Fragment 。
现在唯一剩下的就是当按下按钮获取更多数据,然后按下按钮获取更少数据时,我不希望将 AddShopFragment
fragment 中的所有数据都添加到正在被删除。
因此,我尝试将数据从 AddShopFragment
fragment 发送到 AddMoreInfoForShopActivity
Activity ,然后发送到 BaseActivity
,然后发送到 AddShopFragment
再次,以便我可以填充文本区域和微调器。
请注意,我尝试在 fragment 中显示的数据是:类别、子类别、商店名称、位置、电子邮件和电话。
在尝试显示这些数据之前,所有信息都已正确保存在 Parse 中,因此错误仅与将这些特定数据发送到其他 Activity 并返回到 fragment 有关。
<小时/>这是用户登录成功时发生的异常,因此应用程序必须导航到我已经设置的第一个 fragment :
01-27 21:25:32.911 10009-10009/guide_me_for_all.guide_me_for_all E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: guide_me_for_all.guide_me_for_all, PID: 10009
java.lang.RuntimeException: Unable to start activity ComponentInfo{guide_me_for_all.guide_me_for_all/guide_me_for_all.guide_me_for_all.BaseActivity}: java.lang.NullPointerException
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2212)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2271)
at android.app.ActivityThread.access$800(ActivityThread.java:144)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1205)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5146)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:732)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:566)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.NullPointerException
at guide_me_for_all.guide_me_for_all.AddShopFragment.onCreateView(AddShopFragment.java:271)
at android.support.v4.app.Fragment.performCreateView(Fragment.java:1786)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:947)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1126)
at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:739)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1489)
at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:548)
at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1171)
at android.app.Activity.performStart(Activity.java:5241)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2178)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2271)
at android.app.ActivityThread.access$800(ActivityThread.java:144)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1205)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5146)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:732)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:566)
at dalvik.system.NativeStart.main(Native Method)
错误行是:
if(!getArguments().getString("类别").equals("选择:")&&getArguments().getString("类别")!=null&&!getArguments().getString("类别").isEmpty()&&!getArguments().getString("类别").equals("")) {
代码的 AddShopFragment
部分发送我们不想丢失的数据:
moreinfo.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
Intent intent;
intent = new Intent(AddShopFragment.this.getActivity().getApplicationContext(), AddMoreInfoForShopActivity.class);
if (category.getSelectedItem().toString().equals("Select:") || category.getSelectedItem().toString().isEmpty() || category.getSelectedItem().toString() == null)
intent.putExtra("category", "");
else
intent.putExtra("category", category.getSelectedItem().toString());
if (subcategory_bar.getSelectedItem().toString().equals("Select:") || subcategory_bar.getSelectedItem().toString().isEmpty() || subcategory_bar.getSelectedItem().toString() == null){
if (subcategory_restaurant.getSelectedItem().toString().equals("Select:") || subcategory_restaurant.getSelectedItem().toString().isEmpty() || subcategory_restaurant.getSelectedItem().toString() == null) {
intent.putExtra("subcategory", "");
}
else
intent.putExtra("subcategory", subcategory_restaurant.getSelectedItem().toString());
}
else{
intent.putExtra("subcategory", subcategory_bar.getSelectedItem().toString());
}
if (shopname.getText().toString() == null || shopname.getText().toString().isEmpty())
intent.putExtra("shopname", "");
else
intent.putExtra("shopname", shopname.getText().toString());
if (location.getText().toString() == null || location.getText().toString().isEmpty())
intent.putExtra("location", "");
else
intent.putExtra("location", location.getText().toString());
if (email.getText().toString() == null || email.getText().toString().isEmpty())
intent.putExtra("email", "");
else
intent.putExtra("email", email.getText().toString());
if (telephone.getText().toString() == null || telephone.getText().toString().isEmpty())
intent.putExtra("telephone", "");
else
intent.putExtra("telephone", telephone.getText().toString());
// if (flag_photo == true)
// intent.putExtra("photo", image);
startActivity(intent);
//finish();
}
});
<小时/>
从 fragment 获取数据的代码的 AddMoreInfoForShopActivity
部分:
if (getIntent() != null) {
Intent intent = getIntent();
category = intent.getStringExtra("category");
subcategory = intent.getStringExtra("subcategory");
shopname = intent.getStringExtra("shopname");
location = intent.getStringExtra("location");
email = intent.getStringExtra("email");
telephone = intent.getStringExtra("telephone");
}
else{
category = "";
subcategory = "";
shopname = "";
location = "";
email = "";
telephone = "";
}
<小时/>
将数据发送到 BaseActivity
的代码的 AddMoreInfoForShopActivity
部分:
Intent i = new Intent(AddMoreInfoForShopActivity.this,
BaseActivity.class);
//pass data to an intent to load a specific fragment of reader activity
i.putExtra("opening", OpeningTime);
i.putExtra("closing", ClosingTime);
i.putExtra("dresscoding", dresscoding2);
i.putExtra("music", music2);
i.putExtra("otherinfo", otherinfo2);
i.putExtra("facebook", fb2);
i.putExtra("moneyperperson", moneyperperson2);
i.putExtra("smokingarea", smokingarea2);
i.putExtra("parking", parking2);
i.putExtra("creditcards", creditcards2);
i.putExtra("takeout", takeout2);
i.putExtra("delivery", delivery2);
i.putExtra("freewifi", freewifi2);
i.putExtra("happyhour", happyhour2);
i.putExtra("outdoorseating", outdoorseating2);
i.putExtra("reservations", reservations2);
i.putExtra("appropriategroups", appropriategroup2);
i.putExtra("appropriatekids", appropratekids2);
i.putExtra("category", category);
i.putExtra("subcategory", subcategory);
i.putExtra("shopname", shopname);
i.putExtra("location", location);
i.putExtra("email", email);
i.putExtra("telephone", telephone);
overridePendingTransition(R.anim.push_up_in, R.anim.push_up_out);
startActivity(i);
<小时/>
我的BaseActivity
部分从 Activity 获取数据并发送回 fragment :
if (getIntent() != null) {
Intent i = getIntent();
String opening = i.getStringExtra("opening");
String closing = i.getStringExtra("closing");
String dresscoding = i.getStringExtra("dresscoding");
String music = i.getStringExtra("music");
String otherinfo = i.getStringExtra("otherinfo");
String facebook = i.getStringExtra("facebook");
String moneyperperson = i.getStringExtra("moneyperperson");
String smokingarea = i.getStringExtra("smokingarea");
String creditcards = i.getStringExtra("creditcards");
String parking = i.getStringExtra("parking");
String takeout = i.getStringExtra("takeout");
String delivery = i.getStringExtra("delivery");
String freewifi = i.getStringExtra("freewifi");
String happyhour = i.getStringExtra("happyhour");
String outdoorseating = i.getStringExtra("outdoorseating");
String reservations = i.getStringExtra("reservations");
String appropriategroup = i.getStringExtra("appropriategroups");
String appropratekids = i.getStringExtra("appropriatekids");
String category = i.getStringExtra("category");
String subcategory = i.getStringExtra("subcategory");
String shopname = i.getStringExtra("shopname");
String location = i.getStringExtra("location");
String email = i.getStringExtra("email");
String telephone = i.getStringExtra("telephone");
Fragment fragment = new AddShopFragment();
Bundle bundle=new Bundle();
bundle.putString("opening", opening);
bundle.putString("closing", closing);
bundle.putString("dresscoding", dresscoding);
bundle.putString("music", music);
bundle.putString("otherinfo", otherinfo);
bundle.putString("facebook", facebook);
bundle.putString("moneyperperson", moneyperperson);
bundle.putString("smokingarea", smokingarea);
bundle.putString("creditcards", creditcards);
bundle.putString("parking", parking);
bundle.putString("takeout", takeout);
bundle.putString("delivery", delivery);
bundle.putString("freewifi", freewifi);
bundle.putString("happyhour", happyhour);
bundle.putString("outdoorseating", outdoorseating);
bundle.putString("reservations", reservations);
bundle.putString("appropriategroups", appropriategroup);
bundle.putString("appropriatekids", appropratekids);
bundle.putString("category", category);
bundle.putString("subcategory", subcategory);
bundle.putString("shopname", shopname);
bundle.putString("location", location);
bundle.putString("email", email);
bundle.putString("telephone", telephone);
//set Fragmentclass Arguments
fragment.setArguments(bundle);
FragmentManager fm = getSupportFragmentManager();
fm.beginTransaction().replace(R.id.content_frame, fragment).commit();
//}
}
<小时/>
最后,这是我从 BaseActivity
获取数据并尝试将其显示在屏幕上的方式 - AddShopFragment
:
if (getArguments() != null) {
if (!getArguments().getString("category").equals("Select:") && getArguments().getString("category") != null && !getArguments().getString("category").isEmpty() && !getArguments().getString("category").equals("")) {
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this.getActivity().getApplicationContext(), R.array.category, android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
category.setAdapter(adapter);
int spinnerPostion = adapter.getPosition(getArguments().getString("category"));
category.setSelection(spinnerPostion);
spinnerPostion = 0;
if (getArguments().getString("category").equals("Bar")) {
subcategory_bar.setVisibility(View.VISIBLE);
subcategory_label.setVisibility(View.VISIBLE);
ArrayAdapter<CharSequence> adapter2 = ArrayAdapter.createFromResource(this.getActivity().getApplicationContext(), R.array.subcategory_bar, android.R.layout.simple_spinner_item);
adapter2.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
subcategory_bar.setAdapter(adapter2);
if (!getArguments().getString("subcategory").equals("Select:") && getArguments().getString("subcategory") != null && !getArguments().getString("subcategory").isEmpty() && !getArguments().getString("subcategory").equals("")) {
int spinnerPostion2 = adapter2.getPosition(getArguments().getString("subcategory"));
subcategory_bar.setSelection(spinnerPostion2);
spinnerPostion2 = 0;
}
}
if (getArguments().getString("category").equals("Restaurant")) {
subcategory_restaurant.setVisibility(View.VISIBLE);
subcategory_label.setVisibility(View.VISIBLE);
ArrayAdapter<CharSequence> adapter3 = ArrayAdapter.createFromResource(this.getActivity().getApplicationContext(), R.array.subcategory_restaurant, android.R.layout.simple_spinner_item);
adapter3.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
subcategory_restaurant.setAdapter(adapter3);
if (!getArguments().getString("subcategory").equals("Select:") && getArguments().getString("subcategory") != null && !getArguments().getString("subcategory").isEmpty() && !getArguments().getString("subcategory").equals("")) {
int spinnerPostion3 = adapter3.getPosition(getArguments().getString("subcategory"));
subcategory_restaurant.setSelection(spinnerPostion3);
spinnerPostion3 = 0;
}
}
}
if (getArguments().getString("shopname") != null && !getArguments().getString("shopname").isEmpty() && !getArguments().getString("shopname").equals("")) {
shopname.setText(getArguments().getString("shopname"));
}
if (getArguments().getString("location") != null && !getArguments().getString("location").isEmpty() && !getArguments().getString("location").equals("")) {
location.setText(getArguments().getString("location"));
}
if (getArguments().getString("email") != null && !getArguments().getString("email").isEmpty() && !getArguments().getString("email").equals("")) {
email.setText(getArguments().getString("email"));
}
if (getArguments().getString("telephone") != null && !getArguments().getString("telephone").isEmpty() && !getArguments().getString("telephone").equals("")) {
telephone.setText(getArguments().getString("telephone"));
}
finalOpening = getArguments().getString("opening");
finalClosing = getArguments().getString("closing");
finalDresscoding = getArguments().getString("dresscoding");
finalMusic = getArguments().getString("music");
finalOtherinfo = getArguments().getString("otherinfo");
finalFacebook = getArguments().getString("facebook");
finalMoneyperperson = getArguments().getString("moneyperperson");
if (getArguments().getString("smokingarea") != null && !getArguments().getString("smokingarea").isEmpty()) {
smokingarea = getArguments().getString("smokingarea");
if (smokingarea.equals("Y")) {
finalSmokingarea = 1;
} else if (smokingarea.equals("N")) {
finalSmokingarea = 0;
} else
finalSmokingarea = 2;
}
else{
finalSmokingarea = 2;
}
if (getArguments().getString("parking") != null && !getArguments().getString("parking").isEmpty()) {
parking = getArguments().getString("parking");
if (parking.equals("Y")) {
finalParkingarea = 1;
} else if (parking.equals("N")) {
finalParkingarea = 0;
}
else
finalParkingarea = 2;
}
else{
finalParkingarea = 2;
}
if (getArguments().getString("creditcards") != null && !getArguments().getString("creditcards").isEmpty()) {
creditcards = getArguments().getString("creditcards");
if (creditcards.equals("Y")) {
finalCreditcards = 1;
} else if (creditcards.equals("N")) {
finalCreditcards = 0;
}
else
finalCreditcards = 2;
}
else{
finalCreditcards = 2;
}
if (getArguments().getString("takeout") != null && !getArguments().getString("takeout").isEmpty()) {
takeout = getArguments().getString("takeout");
if (takeout.equals("Y")) {
finalTakeout = 1;
} else if (takeout.equals("N")) {
finalTakeout = 0;
}
else
finalTakeout = 2;
}
else{
finalTakeout = 2;
}
if (getArguments().getString("delivery") != null && !getArguments().getString("delivery").isEmpty()) {
delivery = getArguments().getString("delivery");
if (delivery.equals("Y")) {
finalDelivery = 1;
} else if (delivery.equals("N")) {
finalDelivery = 0;
}
else
finalDelivery = 2;
}
else{
finalDelivery = 2;
}
if (getArguments().getString("freewifi") != null && !getArguments().getString("freewifi").isEmpty()) {
freewifi = getArguments().getString("freewifi");
if (freewifi.equals("Y")) {
finalFreewifi = 1;
} else if (freewifi.equals("N")) {
finalFreewifi = 0;
}
else
finalFreewifi = 2;
}
else{
finalFreewifi = 2;
}
if (getArguments().getString("happyhour") != null && !getArguments().getString("happyhour").isEmpty()) {
happyhour = getArguments().getString("happyhour");
if (happyhour.equals("Y")) {
finalHappyhour = 1;
} else if (happyhour.equals("N")) {
finalHappyhour = 0;
}
else
finalHappyhour = 2;
}
else{
finalHappyhour = 2;
}
if (getArguments().getString("outdoorseating") != null && !getArguments().getString("outdoorseating").isEmpty()) {
outdoorseating = getArguments().getString("outdoorseating");
if (outdoorseating.equals("Y")) {
finalOutdoorseating = 1;
} else if (outdoorseating.equals("N")) {
finalOutdoorseating = 0;
}
else
finalOutdoorseating = 2;
}
else{
finalOutdoorseating = 2;
}
if (getArguments().getString("reservations") != null && !getArguments().getString("reservations").isEmpty()) {
reservations = getArguments().getString("reservations");
if (reservations.equals("Y")) {
finalReservations = 1;
} else if (reservations.equals("N")) {
finalReservations = 0;
}
else
finalReservations = 2;
}
else{
finalReservations = 2;
}
if (getArguments().getString("appropriategroups") != null && !getArguments().getString("appropriategroups").isEmpty()) {
appropriategroup = getArguments().getString("appropriategroups");
if (appropriategroup.equals("Y")) {
finalAppropriategroup = 1;
} else if (appropriategroup.equals("N")) {
finalAppropriategroup = 0;
}
else
finalAppropriategroup = 2;
}
else{
finalAppropriategroup = 2;
}
if (getArguments().getString("appropriatekids") != null && !getArguments().getString("appropriatekids").isEmpty()) {
appropriatekids = getArguments().getString("appropriatekids");
if (appropriatekids.equals("Y")) {
finalAppropriatekids = 1;
} else if (appropriatekids.equals("N")) {
finalAppropriatekids = 0;
}
else
finalAppropriatekids = 2;
}
else{
finalAppropriatekids = 2;
}
}
else{
finalOpening = "";
finalClosing = "";
finalMoneyperperson = "";
finalDresscoding = "";
finalMusic = "";
finalOtherinfo = "";
finalFacebook = "";
finalSmokingarea = 2;
finalParkingarea = 2;
finalCreditcards = 2;
finalTakeout = 2;
finalDelivery = 2;
finalFreewifi = 2;
finalHappyhour = 2;
finalOutdoorseating = 2;
finalReservations = 2;
finalAppropriategroup = 2;
finalAppropriatekids = 2;
}
<小时/>
如您所见,我还发布了我已经设法保存到 Parse 的数据,因此这些数据不是问题的一部分。这样,您可以注意到,我没有做任何与我对那些运行良好的数据所做的事情不同的事情。
最佳答案
问题似乎是 getArguments().getString("category")
为 null
。检查您如何评估变量:
if (!getArguments().getString("category").equals("Select:")
//up here, you assume the variable is not null
&& getArguments().getString("category") != null
//here you check if the variable is null or not, very late...
&& !getArguments().getString("category").isEmpty()
//here you evaluate if the value of getArguments().getString("category") is not empty
&& !getArguments().getString("category").equals("")
//here you check one more time if the value of getArguments().getString("category") is not empty) {
只需将空检查移到前面即可解决此问题:
if (getArguments().getString("category") != null
&& !getArguments().getString("category").isEmpty()
&& !getArguments().getString("category").equals("")
&& !getArguments().getString("category").equals("Select:")) {
或者针对这些情况的更好解决方案:将所需的文字(或编译常量)String
与您的String
参数进行比较:
if ("Select:".equals(getArguments().getString("category")) {
关于java - 在 fragment 和 Activity 之间交换数据 - NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28179015/
我在理解这些函数如何更新底层引用、原子等时遇到问题。 文档说:(应用当前身份值参数) (def one (atom 0)) (swap! one inc) ;; => 1 所以我想知道它是如何“扩展到
尝试让一段代码看起来更好。 我在 Clojurescript 中有以下内容: (swap! app-state assoc-in [:lastresults] []) (swap! app-state
我在数据库中有带有排序顺序号的记录。现在我想创建一个带有向上和向下按钮的用户界面来重新排序它们。制作两个 functionsUp(record) 和 functionDown(record) 的最佳算
如何才能让第二次点击时返回?我想我必须以某种方式找到活跃的,但不确定。 $("#test").click(function(){ $("#dsa").fadeOut() $("#asd
我需要有关这次考试的帮助。我需要反转输入字符串。 int main(void) { char str[30]; int strlen; int i=0; int count=0;int
我正在用 C 语言玩指针...我尝试编写一个接收指向值的指针、检索指针的指针并交换指向值的指针的交换,而不是接收指向值的指针和交换值的常规交换。 这是代码... 互换功能: void swap(voi
如何在 javascript 中切换值?例如,如果 x = apple,则函数应返回 x = orange。如果 x = orange,则函数应返回 x = apple。不确定,这里有什么用,切换或交
刚接触这类东西,可能做错了什么,但是- 我有 3 个成员 std::unique_ptr currentWeapon; std::unique_ptr weaponSlotOne; std::uniq
我想在 Map 内的不可变列表内交换项目,示例: const Map = Immutable.fromJS({ name:'lolo', ids:[3,4,5] }); 我正在尝试使用
我创建了动态数组。如果具有某些值,则填充。打印它。但是交换/交换指针后(任务是在特定条件下交换行) 条件取决于sumL。为了不浪费您的时间,我没有描述细节。 问题在于交换指针。 for ( k = 0
要反转整个 vector,存在 std::reverse。但我想将一个 vector “划分”为两部分(恰好在中间)并将两者反转,将它们放回一起并再次反转整个 vector 。例如我们有: 0 1 2
我正在致力于代码最小化和增强。我的问题是:是否可以在不破坏代码逻辑的情况下交换上面的 if 语句? int c1 = Integer.parseInt(args[0]) ; int c
我读过释放 vector 内存的最佳方法是: vector().swap(my_vector); 而且我真的不明白发生了什么。交换函数需要 2 个 vector 并交换它们的元素,例如: vector
我正在尝试编写一个 Haskell 函数,该函数接受一串字母对,并在所有字母组成的字符串中交换该对字母,但我想出的方法感觉很尴尬且不惯用。 我有 swap a b = map (\x-> if x =
我正在尝试使用向上和向下箭头交换两个元素。 JSFiddle 解决方案会很棒! 我的 HTML: Some text down Some ot
当将 subview 与另一个太阳 View 交换时,是否需要重新应用约束?是否需要删除适用于已删除 View 的约束? 或者它们应该自动持续存在? 最佳答案 约束是 View 的“一部分”。当您删除
所以我制作网站已经有一段时间了,但只是真正用于显示和信息的东西。我想尝试一下 AngularJs,所以我遵循了 Codeschool 上的指南。当我根据在线文档意识到我使用的语法不被推荐时,我在该应用
我正在尝试编写一个函数,可以将字符串中的 unicode 字符替换为非 unicode ASCII 字符,问题是上传包含它们的字符串时,unicode 连字符和引号不会被读取。 我希望该函数有一个带有
我目前正在使用 Azure 网站来部署我的应用程序。我目前正在使用两个网站,每个网站监听我的 GIT 的不同分支。如图所示here . 现在,为了让它变得完美,我只是缺少一种在这两个实例之间快速切换的
在我的 javascript 中,有两个包含一些值的 div。 我想交换这些div中的值。 有什么解决办法吗? 最佳答案 var temp = $('#div1').html(); $('#div1'
我是一名优秀的程序员,十分优秀!