首页 > 解决方案 > 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)

谢谢你的支持。

标签: androidandroid-fragmentsandroid-activity

解决方案


推荐阅读