Java 为片段中的对象赋值时出现问题

Java 为片段中的对象赋值时出现问题,java,android,Java,Android,在尝试设置DetailsLandscapeFragment.java中movie变量的值时,我遇到了一个奇怪的问题。 带有tag“tag1”的日志消息正确显示了电影的标题,这意味着变量不为null,但是带有tag“tag2”的日志消息将不会执行,这意味着变量为null。 相关代码为: DetailsLandscapeFragment.java package io.github.the_dagger.movies; public class DetailsLandscapeFragment

在尝试设置
DetailsLandscapeFragment.java
movie
变量的值时,我遇到了一个奇怪的问题。 带有tag
“tag1”
的日志消息正确显示了电影的标题,这意味着变量不为null,但是带有tag
“tag2”
的日志消息将不会执行,这意味着变量为
null
。 相关代码为:

DetailsLandscapeFragment.java

package io.github.the_dagger.movies;


public class DetailsLandscapeFragment extends Fragment {
SingleMovie movie ;                   //Trying to set value of this Variable
TextView title;
TextView overviewTextView;
TextView releaseTextView;
ImageView posterImage;
RatingBar rb;

public void getMovie(SingleMovie singleMovie){
    this.movie = singleMovie;
    Log.v("tag1",movie.movieTitle);        //Shows the movie Title Correctly
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.details_land_frag,container,false);
    title = (TextView) view.findViewById(R.id.movieDetailTitle1);
    overviewTextView = (TextView) view.findViewById(R.id.movieSummary1);
    releaseTextView = (TextView) view.findViewById(R.id.releaseDate1);
    posterImage = (ImageView) view.findViewById(R.id.posterImageDetail1);
    rb = (RatingBar) view.findViewById(R.id.ratingBar11);
    if(movie != null) {
        Log.v("tag2",movie.movieTitle);                     //Won't run
        title.setText(movie.movieTitle);
        Picasso.with(getActivity()).load(movie.movieImage).error(R.drawable.placeholder).into(posterImage, PicassoPalette.with(movie.movieImage, posterImage).use(BitmapPalette.Profile.MUTED)
        );
        String overView = movie.movieOverView;
        String summary = "";
        float d = Float.parseFloat(movie.movieRating);
        rb.setRating((Math.round(d)/2));
        releaseTextView.setText(movie.movieReleaseDate);
        for (String sum:overView.split("(?<=[.])\\s+"))
            if(summary == "")
                summary = sum;
            else
                summary = summary + "\n" + sum;
        overviewTextView.setText(summary);
    }
    else{
        title.setText("Movie Title");
//               Picasso.with(getActivity()).load(movie.movieImage).error(R.drawable.placeholder).into(posterImage, PicassoPalette.with(movie.movieImage, posterImage).use(BitmapPalette.Profile.MUTED)
//            );
        rb.setRating(0);
        releaseTextView.setText("N/A");
        overviewTextView.setText("Summary");
    }
    return view;

}
}
package io.github.the_dagger.movies;
public class MainActivity extends AppCompatActivity implements Communicator{
DetailsLandscapeFragment f;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    f = (DetailsLandscapeFragment) getFragmentManager().findFragmentById(R.id.fragment2);
    FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
    fab.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                    .setAction("Action", null).show();
        }
    });
}

@Override
public void respond(SingleMovie movie) {
    if(f != null && f.isVisible()){
        f.getMovie(movie);
    }
    else{
        Intent switchIntent = new Intent(this, DetailsActivity.class)
                    .putExtra(getString(R.string.Poster), movie);
        startActivity(switchIntent);
    }
}
}
public class SingleMovie implements Parcelable {
String movieImage;
String movieTitle;
String movieOverView;
String movieRating;
String movieReleaseDate;
String movieBackDropImage;

public SingleMovie(String image, String title, String overView, String rating, String releaseDate, String backDropImage) {
    this.movieImage = image;
    this.movieTitle = title;
    this.movieOverView = overView;
    this.movieRating = rating;
    this.movieReleaseDate = releaseDate;
    this.movieBackDropImage = backDropImage;
}

public SingleMovie(Parcel in) {
    this.movieImage = in.readString();
    this.movieTitle = in.readString();
    this.movieOverView = in.readString();
    this.movieRating = in.readString();
    this.movieReleaseDate = in.readString();
    this.movieBackDropImage = in.readString();
}

public static final Creator<SingleMovie> CREATOR = new Creator<SingleMovie>() {
    @Override
    public SingleMovie createFromParcel(Parcel in) {
        return new SingleMovie(in);
    }

    @Override
    public SingleMovie[] newArray(int size) {
        return new SingleMovie[size];
    }
};

@Override
public int describeContents() {
    return 0;
}

@Override
public void writeToParcel(Parcel dest, int flags) {
    dest.writeString(movieImage);
    dest.writeString(movieTitle);
    dest.writeString(movieOverView);
    dest.writeString(movieRating);
    dest.writeString(movieReleaseDate);
    dest.writeString(movieBackDropImage);
}
}
SingleMovie.java

package io.github.the_dagger.movies;


public class DetailsLandscapeFragment extends Fragment {
SingleMovie movie ;                   //Trying to set value of this Variable
TextView title;
TextView overviewTextView;
TextView releaseTextView;
ImageView posterImage;
RatingBar rb;

public void getMovie(SingleMovie singleMovie){
    this.movie = singleMovie;
    Log.v("tag1",movie.movieTitle);        //Shows the movie Title Correctly
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.details_land_frag,container,false);
    title = (TextView) view.findViewById(R.id.movieDetailTitle1);
    overviewTextView = (TextView) view.findViewById(R.id.movieSummary1);
    releaseTextView = (TextView) view.findViewById(R.id.releaseDate1);
    posterImage = (ImageView) view.findViewById(R.id.posterImageDetail1);
    rb = (RatingBar) view.findViewById(R.id.ratingBar11);
    if(movie != null) {
        Log.v("tag2",movie.movieTitle);                     //Won't run
        title.setText(movie.movieTitle);
        Picasso.with(getActivity()).load(movie.movieImage).error(R.drawable.placeholder).into(posterImage, PicassoPalette.with(movie.movieImage, posterImage).use(BitmapPalette.Profile.MUTED)
        );
        String overView = movie.movieOverView;
        String summary = "";
        float d = Float.parseFloat(movie.movieRating);
        rb.setRating((Math.round(d)/2));
        releaseTextView.setText(movie.movieReleaseDate);
        for (String sum:overView.split("(?<=[.])\\s+"))
            if(summary == "")
                summary = sum;
            else
                summary = summary + "\n" + sum;
        overviewTextView.setText(summary);
    }
    else{
        title.setText("Movie Title");
//               Picasso.with(getActivity()).load(movie.movieImage).error(R.drawable.placeholder).into(posterImage, PicassoPalette.with(movie.movieImage, posterImage).use(BitmapPalette.Profile.MUTED)
//            );
        rb.setRating(0);
        releaseTextView.setText("N/A");
        overviewTextView.setText("Summary");
    }
    return view;

}
}
package io.github.the_dagger.movies;
public class MainActivity extends AppCompatActivity implements Communicator{
DetailsLandscapeFragment f;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    f = (DetailsLandscapeFragment) getFragmentManager().findFragmentById(R.id.fragment2);
    FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
    fab.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                    .setAction("Action", null).show();
        }
    });
}

@Override
public void respond(SingleMovie movie) {
    if(f != null && f.isVisible()){
        f.getMovie(movie);
    }
    else{
        Intent switchIntent = new Intent(this, DetailsActivity.class)
                    .putExtra(getString(R.string.Poster), movie);
        startActivity(switchIntent);
    }
}
}
public class SingleMovie implements Parcelable {
String movieImage;
String movieTitle;
String movieOverView;
String movieRating;
String movieReleaseDate;
String movieBackDropImage;

public SingleMovie(String image, String title, String overView, String rating, String releaseDate, String backDropImage) {
    this.movieImage = image;
    this.movieTitle = title;
    this.movieOverView = overView;
    this.movieRating = rating;
    this.movieReleaseDate = releaseDate;
    this.movieBackDropImage = backDropImage;
}

public SingleMovie(Parcel in) {
    this.movieImage = in.readString();
    this.movieTitle = in.readString();
    this.movieOverView = in.readString();
    this.movieRating = in.readString();
    this.movieReleaseDate = in.readString();
    this.movieBackDropImage = in.readString();
}

public static final Creator<SingleMovie> CREATOR = new Creator<SingleMovie>() {
    @Override
    public SingleMovie createFromParcel(Parcel in) {
        return new SingleMovie(in);
    }

    @Override
    public SingleMovie[] newArray(int size) {
        return new SingleMovie[size];
    }
};

@Override
public int describeContents() {
    return 0;
}

@Override
public void writeToParcel(Parcel dest, int flags) {
    dest.writeString(movieImage);
    dest.writeString(movieTitle);
    dest.writeString(movieOverView);
    dest.writeString(movieRating);
    dest.writeString(movieReleaseDate);
    dest.writeString(movieBackDropImage);
}
}
public类SingleMovie实现可包裹{
字符串电影图像;
弦乐电影;
弦乐电影概述;
弦动;
字符串movieReleaseDate;
字符串电影背景图像;
public SingleMovie(字符串图像、字符串标题、字符串概述、字符串评级、字符串发布日期、字符串backDropImage){
this.movieImage=图像;
this.movieTitle=标题;
this.movieOverView=概述;
这个。移动=额定值;
this.movieReleaseDate=发布日期;
this.movieBackDropImage=backDropImage;
}
公共电影(包裹内){
this.movieImage=in.readString();
this.movieTitle=in.readString();
this.movieOverView=in.readString();
this.movieRating=in.readString();
this.movieReleaseDate=in.readString();
this.movieBackDropImage=in.readString();
}
公共静态最终创建者=新创建者(){
@凌驾
公共单张电影createFromParcel(包裹中){
返回新单曲电影(中);
}
@凌驾
公共SingleMovie[]新数组(整数大小){
返回新的单张电影[大小];
}
};
@凌驾
公共int描述内容(){
返回0;
}
@凌驾
公共无效写入包裹(包裹目的地,内部标志){
目的地书面记录(电影图像);
目的地编剧(电影);
目的地记录(电影概览);
目的书面限制(电影化);
目的地书面资本(movieReleaseDate);
目的地记录(电影背景图像);
}
}
任何帮助或线索都将不胜感激。
谢谢

原因是
在片段上的公共视图onCreateView(LayoutInflater inflater、ViewGroup容器、Bundle savedInstanceState)
之前执行
公共无效getMovie(SingleMovie SingleMovie)
。要查看首先调用哪个方法,可以移动
Log.v(“tag2”,movie.movieTitle)在if(movie!=null)
语句上方(注意空的movie对象!!!)并在日志上看到它是第一次打印“tag2”或“tag1”

您必须找到在
onCreateView
中设置电影对象的方法,或者从该点移动代码

if(movie != null) {
    ...
    overviewTextView.setText(summary);
}

onCreateView
getMovie

原因是
public View onCreateView(LayoutInflater充气机、ViewGroup容器、Bundle savedInstanceState)
public void getMovie(SingleMovie SingleMovie)
之前对片段执行。要查看首先调用哪个方法,可以移动
Log.v(“tag2”,movie.movieTitle)在if(movie!=null)
语句上方(注意空的movie对象!!!)并在日志上看到它是第一次打印“tag2”或“tag1”

您必须找到在
onCreateView
中设置电影对象的方法,或者从该点移动代码

if(movie != null) {
    ...
    overviewTextView.setText(summary);
}

onCreateView
getMovie
我想这是因为
onCreateView
在调用
respond
函数之前调用了它。因此,必须首先在日志中获取
标记2
,然后在触发
响应
时,调用
获取电影
函数,从而触发
标记1
日志消息

您不应该在OnCreate中进行所有设置,而应该仅在getMovie函数中设置值时设置值。例如,您的代码可以重写为

    public void getMovie(SingleMovie singleMovie){
        this.movie = singleMovie;
        Log.v("tag1",movie.movieTitle);        //Shows the movie Title Correctly
        initMovie(movie);
    }
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.details_land_frag,container,false);
        title = (TextView) view.findViewById(R.id.movieDetailTitle1);
        overviewTextView = (TextView) view.findViewById(R.id.movieSummary1);
        releaseTextView = (TextView) view.findViewById(R.id.releaseDate1);
        posterImage = (ImageView) view.findViewById(R.id.posterImageDetail1);
        rb = (RatingBar) view.findViewById(R.id.ratingBar11);

            title.setText("Movie Title");
    //               Picasso.with(getActivity()).load(movie.movieImage).error(R.drawable.placeholder).into(posterImage, PicassoPalette.with(movie.movieImage, posterImage).use(BitmapPalette.Profile.MUTED)
    //            );
            rb.setRating(0);
            releaseTextView.setText("N/A");
            overviewTextView.setText("Summary");

        return view;

    }
public void initMovie(SingleMovie movie)
{
if(movie != null) {
        Log.v("tag2",movie.movieTitle);                     //Won't run
        title.setText(movie.movieTitle);
        Picasso.with(getActivity()).load(movie.movieImage).error(R.drawable.placeholder).into(posterImage, PicassoPalette.with(movie.movieImage, posterImage).use(BitmapPalette.Profile.MUTED)
        );
        String overView = movie.movieOverView;
        String summary = "";
        float d = Float.parseFloat(movie.movieRating);
        rb.setRating((Math.round(d)/2));
        releaseTextView.setText(movie.movieReleaseDate);
        for (String sum:overView.split("(?<=[.])\\s+"))
            if(summary == "")
                summary = sum;
            else
                summary = summary + "\n" + sum;
        overviewTextView.setText(summary);
    }
    else{
        title.setText("Movie Title");
//               Picasso.with(getActivity()).load(movie.movieImage).error(R.drawable.placeholder).into(posterImage, PicassoPalette.with(movie.movieImage, posterImage).use(BitmapPalette.Profile.MUTED)
//            );
        rb.setRating(0);
        releaseTextView.setText("N/A");
        overviewTextView.setText("Summary");
    }
}
public-void-getMovie(SingleMovie-SingleMovie){
this.movie=singleMovie;
Log.v(“tag1”,movie.movieTitle);//正确显示电影标题
电影(电影),;
}
@可空
@凌驾
CreateView上的公共视图(布局、充气机、视图组容器、捆绑包保存状态){
视图=充气机。充气(右侧布局。详细信息\u陆地\u框架,容器,假);
title=(TextView)view.findViewById(R.id.movieDetailTitle1);
概览TextView=(TextView)view.findViewById(R.id.movieSummary1);
releaseTextView=(TextView)view.findViewById(R.id.releaseDate1);
posterImage=(ImageView)view.findViewById(R.id.posterImageDetail1);
rb=(RatingBar)view.findViewById(R.id.ratingBar11);
title.setText(“电影片名”);
//Picasso.with(getActivity()).load(movie.movieImage).error(R.drawable.placeholder).进入(posterImage,Picassoplete.with(movie.movieImage,posterImage).使用(BitmapPalette.Profile.MUTED)
//            );
rb.设定值(0);
releaseTextView.setText(“不适用”);
概述text.setText(“摘要”);
返回视图;
}
公共电影(单人电影)
{
如果(电影!=null){
Log.v(“tag2”,movie.movieTitle);//不会运行
title.setText(movie.movieTitle);
Picasso.with(getActivity()).load(movie.movieImage).error(R.drawable.placeholder).进入(posterImage,Picassoplete.with(movie.movieImage,posterImage).使用(BitmapPalette.Profile.MUTED)
);
字符串概述=movie.movieOverView;
字符串摘要=”;
float d=float.parseFloat(movie.movieRating);
rb.设定值((数学轮(d)/2));
releaseTextView.setText(movie.movieReleaseDate);

for(String sum:overView.split((?我猜这是因为
onCreateView
在调用
respond
函数之前调用了它。因此,您必须得到