android - findFragmentById() 它不为空
问题描述
如果方向是纵向,我有一个片段,如果方向是横向,我有两个片段。
第一次效果很好,纵向可以,横向可以,但是我回到纵向并且失败了。
问题出在这里:当我有对 FragmentDetails 的引用(它应该为空)时,应该为空,因为在纵向模式下是删除,但它不为空。
getSupportFragmentManager().findFragmentById(R.id.fragmentMainActivityDetailsMail);
这是片段详细信息
public class DetailsMailFragment extends android.support.v4.app.Fragment {
private TextView textViewDetailsStaticSubject;
private TextView textViewDetailsSubject;
private TextView textViewDetailsStaticFrom;
private TextView textViewDetailsFrom;
private TextView textViewDetailsMailBody;
public DetailsMailFragment() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view=inflater.inflate(R.layout.fragment_details_mail, container, false);
textViewDetailsStaticSubject=(TextView)view.findViewById(R.id.textViewDetailsStaticSubject);
textViewDetailsSubject=(TextView)view.findViewById(R.id.textViewDetailsSubject);
textViewDetailsStaticFrom=(TextView)view.findViewById(R.id.textViewDetailsStaticFrom);
textViewDetailsFrom=(TextView)view.findViewById(R.id.textViewDetailsFrom);
textViewDetailsMailBody=(TextView)view.findViewById(R.id.textViewDetailsMailBody);
return view;
}
public void bindMailData(String subject,String senderName,String message) {
textViewDetailsStaticSubject.setText("Subject:");
textViewDetailsSubject.setText(subject);
textViewDetailsStaticFrom.setText("From:");
textViewDetailsFrom.setText(senderName);
textViewDetailsMailBody.setText(message);
}
}
这是主要活动
public class MainActivity extends FragmentActivity implements MailFragment.MailClickListener {
private boolean isMultiPanel;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public void onMailClickListener(Mail email) {
setMultiPanel();
if(isMultiPanel){
DetailsMailFragment details=(DetailsMailFragment) getSupportFragmentManager().findFragmentById(R.id.fragmentMainActivityDetailsMail);
details.bindMailData(email.getSubject(),email.getSenderName(),email.getMessage());
}else{
Intent intent=new Intent(MainActivity.this,DetailsActivity.class);
intent.putExtra("subject",email.getSubject());
intent.putExtra("senderName",email.getSenderName());
intent.putExtra("message",email.getMessage());
startActivity(intent);
}
}
public void setMultiPanel(){
DetailsMailFragment details=(DetailsMailFragment) getSupportFragmentManager().findFragmentById(R.id.fragmentMainActivityDetailsMail);
isMultiPanel=details!=null;
}
}
这是纵向模式下的主要活动布局
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".Activities.MainActivity">
<fragment
android:id="@+id/fragmentMainActivityMail"
android:name="com.jfarias.mymaillab09.Fragments.MailFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:layout="@layout/fragment_mail">
</fragment>
</android.support.constraint.ConstraintLayout>
这是横向模式下的主要活动布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".Activities.MainActivity">
<fragment
android:id="@+id/fragmentMainActivityMail"
android:layout_height="match_parent"
android:layout_width="0dp"
android:name="com.jfarias.mymaillab09.Fragments.MailFragment"
tools:layout="@layout/fragment_mail"
android:layout_weight="0.4"
/>
<fragment
android:id="@+id/fragmentMainActivityDetailsMail"
android:layout_height="match_parent"
android:layout_width="0dp"
android:name="com.jfarias.mymaillab09.Fragments.DetailsMailFragment"
tools:layout="@layout/fragment_details_mail"
android:layout_weight="0.6"
>
</fragment>
</LinearLayout>
错误日志
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.jfarias.mymaillab09, PID: 15223
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference
at com.jfarias.mymaillab09.Fragments.DetailsMailFragment.bindMailData(DetailsMailFragment.java:42)
at com.jfarias.mymaillab09.Activities.MainActivity.onMailClickListener(MainActivity.java:35)
at com.jfarias.mymaillab09.Fragments.MailFragment$1.onItemClick(MailFragment.java:58)
at android.widget.AdapterView.performItemClick(AdapterView.java:350)
at android.widget.AbsListView.performItemClick(AbsListView.java:1683)
at android.widget.AbsListView$PerformClick.run(AbsListView.java:4094)
at android.widget.AbsListView$10.run(AbsListView.java:6583)
at android.os.Handler.handleCallback(Handler.java:789)
at android.os.Handler.dispatchMessage(Handler.java:98)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6938)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)
谢谢你的支持。
解决方案
推荐阅读
- python - Scrapy:选择一个紧随其后的兄弟,如果不存在则返回空字符串
- python - 如何在纸浆中使用初始解决方案(python)
- javascript - d3/js 数据操作删除列
- angular - 在移动设备上离线时从 Progressive Web App 访问本地文件
- xcode - “OS X 10.7 之前的自动布局”
- sql - 修复 ConnectionString 属性未初始化
- mysql - 如果键存在,则将每日表插入主表并更新主表中的行
- websphere - Websphere 应用程序服务器类加载器策略
- sql - SQL 子查询未返回预期结果
- ckan - 从另一个扩展调用一个扩展中的函数