Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/227.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 使用okHtttp的多页多片段_Android_Android Fragments_Tablet_Okhttp - Fatal编程技术网

Android 使用okHtttp的多页多片段

Android 使用okHtttp的多页多片段,android,android-fragments,tablet,okhttp,Android,Android Fragments,Tablet,Okhttp,我是android开发者的新手,我正在尝试为大屏幕创建多窗格。它有3个片段。如果我保留2个片段,一切都很好。第三个评论片段有Http调用。我面临的问题是我无法在细节片段下面显示评论片段。 1.由于我直接调用updateView方法,所有成员变量都没有初始化,尽管它们是在onCreateView方法中分配的 2.因此,我正在使用getview()重新分配,但我没有得到屏幕,尽管适配器计数大于0。 代码在移动设备中按预期工作 activity_main.xml <LinearLayout

我是android开发者的新手,我正在尝试为大屏幕创建多窗格。它有3个片段。如果我保留2个片段,一切都很好。第三个评论片段有Http调用。我面临的问题是我无法在细节片段下面显示评论片段。

1.由于我直接调用updateView方法,所有成员变量都没有初始化,尽管它们是在onCreateView方法中分配的

2.因此,我正在使用getview()重新分配,但我没有得到屏幕,尽管适配器计数大于0。 代码在移动设备中按预期工作 activity_main.xml

   <LinearLayout 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"
        android:baselineAligned="false"
        android:divider="?android:attr/dividerHorizontal"
        android:orientation="horizontal"
        >

        <!--
        This layout is a two-pane layout for the Items master/detail flow.
        -->

        <fragment
            android:id="@+id/fragment_forecast"
            android:name="com.example.android.app.popularmovies.fragmetns.MovieGridFragment"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_weight="2"
            tools:layout="@layout/movie_grid_fragment" />

       <LinearLayout
            android:layout_width="wrap_content"
           android:layout_weight="1"
            android:layout_height="match_parent"
           android:orientation="vertical"
           >
        <FrameLayout
            android:id="@+id/movie_detail_activity"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:visibility="invisible"
           />
           <FrameLayout
               android:id="@+id/movie_review"
               android:layout_width="match_parent"
               android:layout_height="wrap_content"
               />
        </LinearLayout>
    </LinearLayout>

复习碎片类

public class MovieReviewFragment extends Fragment {

private ProgressBar progressBar;
private RecyclerView mRecyclerView;
private RecyclerView.Adapter mAdapter;
private RecyclerView.LayoutManager mLayoutManager;
private List<MovieReview> movieReviewList;
private static final String LOG_TAG = MovieReviewFragment.class.getSimpleName();

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (savedInstanceState != null && savedInstanceState.containsKey("REVIEW_DATA")) {
        movieReviewList = savedInstanceState.getParcelableArrayList("REVIEW_DATA");
    } else {
        movieReviewList = new ArrayList<>();
    }
}


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.movie_review, container, false);
    Intent intent = getActivity().getIntent();
    if (intent != null && intent.hasExtra(PopularMovieConstants.MOVIE_DATA)) {
        MovieDetails movieDetails = intent.getParcelableExtra(PopularMovieConstants.MOVIE_DATA);
       // initUI(rootView);
        progressBar = ((ProgressBar) rootView.findViewById(R.id.reviewProgessBar));
        mRecyclerView = (RecyclerView) rootView.findViewById(R.id.MovieReviewView);
        mRecyclerView.setHasFixedSize(true);
        mLayoutManager = new LinearLayoutManager(getContext());
        mRecyclerView.setLayoutManager(mLayoutManager);
        mAdapter = new MovieReviewListAdapter(movieReviewList);
        mRecyclerView.setAdapter(mAdapter);
        if (mAdapter.getItemCount() == 0) {
            getReview(movieDetails);
        } else {
            progressBar.setVisibility(View.GONE);
        }
    }
    return rootView;
}

public void initUI(View view) {
    Log.d(LOG_TAG,"start initView");
    progressBar = ((ProgressBar) view.findViewById(R.id.reviewProgessBar));
    mRecyclerView = (RecyclerView) view.findViewById(R.id.MovieReviewView);
    mRecyclerView.setHasFixedSize(true);
    mLayoutManager = new LinearLayoutManager(getContext());
    mRecyclerView.setLayoutManager(mLayoutManager);
    mAdapter = new MovieReviewListAdapter(movieReviewList);
    mRecyclerView.setAdapter(mAdapter);
}


public void updateView(MovieDetails MovieDetails) {
    //initUI(getView());
    progressBar=(ProgressBar)getView().findViewById(R.id.reviewProgessBar);
    mRecyclerView=(RecyclerView) getView().findViewById(R.id.MovieReviewView);
    mRecyclerView.setHasFixedSize(true);
    mLayoutManager = new LinearLayoutManager(getContext());
    mRecyclerView.setLayoutManager(mLayoutManager);
    mAdapter = new MovieReviewListAdapter(new ArrayList<MovieReview>());
    mRecyclerView.setAdapter(mAdapter);

    getReview(MovieDetails);
    Log.d(LOG_TAG,"update View Completed");
}
public void getReview(MovieDetails MovieDetails) {
    Log.d(LOG_TAG, "updateView MovieReviewFragment");
    Uri builtUri = Uri.parse(PopularMovieConstants.BASE_URL)
            .buildUpon()
            .appendPath(PopularMovieConstants.MOVIE_APPENDER)
            .appendPath(PopularMovieConstants.MOVIE_PATH)
            .appendPath(Integer.toString(MovieDetails.getId()))
            .appendPath(PopularMovieConstants.REVIEWS)
            .appendQueryParameter(PopularMovieConstants.API_KEY_PARAM, BuildConfig.THE_MOVIE_DB_API_KEY)
            .build();

    Log.d(LOG_TAG, builtUri.toString());
    Request request = new Request.Builder()
            .url(builtUri.toString())
            .build();

    OkHttpClient client = new OkHttpClient();
    client.newCall(request).enqueue(new Callback() {
        @Override
        public void onFailure(Request request, IOException throwable) {
            throwable.printStackTrace();

        }

        @Override
        public void onResponse(Response response) throws IOException {
            if (!response.isSuccessful())
                throw new IOException("Unexpected code " + response);
            Gson gson = new Gson();
            final MovieReviewsDTO reviews = gson.fromJson(response.body().charStream(), MovieReviewsDTO.class);
            Log.d(LOG_TAG, "success");
            getActivity().runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    ((MovieReviewListAdapter) mAdapter).setGridData(reviews.getResults());
                    Log.d(LOG_TAG, "ui" + ((MovieReviewListAdapter) mAdapter).getItemCount());
                    progressBar.setVisibility(View.GONE);

                }

            });

        }
    });

}

@Override
public void onSaveInstanceState(Bundle outState) {
    outState.putParcelableArrayList("REVIEW_DATA"
            , (ArrayList<? extends Parcelable>) ((MovieReviewListAdapter) mAdapter).getGridData());
    super.onSaveInstanceState(outState);
}
公共类MovieReviewFragment扩展片段{
私人ProgressBar ProgressBar;
私人回收视图mRecyclerView;
专用回收器查看适配器mAdapter;
private RecyclerView.LayoutManager MLLayoutManager;
私有列表电影预览列表;
私有静态最终字符串LOG_TAG=MovieReviewFragment.class.getSimpleName();
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
if(savedInstanceState!=null&&savedInstanceState.containsKey(“查看数据”)){
movieReviewList=savedInstanceState.getParcelableArrayList(“查看数据”);
}否则{
movieReviewList=新的ArrayList();
}
}
@凌驾
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState){
视图根视图=充气机。充气(R.layout.movie\u review,container,false);
Intent Intent=getActivity().getIntent();
if(intent!=null&&intent.hasExtra(PopularMovieConstants.MOVIE_数据)){
MovieDetails MovieDetails=intent.getParcelableExtra(PopularMovieConstants.MOVIE_数据);
//initUI(rootView);
progressBar=((progressBar)rootView.findviewbyd(R.id.reviewprogesbar));
mRecyclerView=(RecyclerView)rootView.findViewById(R.id.MovieReviewView);
mRecyclerView.setHasFixedSize(true);
mLayoutManager=newlinearlayoutmanager(getContext());
mRecyclerView.setLayoutManager(mllayoutmanager);
mAdapter=新的MovieReviewListAdapter(movieReviewList);
mRecyclerView.setAdapter(mAdapter);
if(mAdapter.getItemCount()==0){
getReview(电影详情);
}否则{
progressBar.setVisibility(View.GONE);
}
}
返回rootView;
}
公共void initUI(视图){
Log.d(Log_标签,“start initView”);
progressBar=((progressBar)view.findViewById(R.id.ReviewProgressBar));
mRecyclerView=(RecyclerView)view.findviewbyd(R.id.MovieReviewView);
mRecyclerView.setHasFixedSize(true);
mLayoutManager=newlinearlayoutmanager(getContext());
mRecyclerView.setLayoutManager(mllayoutmanager);
mAdapter=新的MovieReviewListAdapter(movieReviewList);
mRecyclerView.setAdapter(mAdapter);
}
public void updateView(MovieDetails MovieDetails){
//initUI(getView());
progressBar=(progressBar)getView().findViewById(R.id.ReviewProgressBar);
mRecyclerView=(RecyclerView)getView().findviewbyd(R.id.MovieReviewView);
mRecyclerView.setHasFixedSize(true);
mLayoutManager=newlinearlayoutmanager(getContext());
mRecyclerView.setLayoutManager(mllayoutmanager);
mAdapter=new MovieReviewListAdapter(new ArrayList());
mRecyclerView.setAdapter(mAdapter);
getReview(电影详情);
Log.d(Log_标签,“更新视图完成”);
}
public void getReview(MovieDetails MovieDetails){
Log.d(Log_标签,“updateView MovieReviewFragment”);
Uri builtUri=Uri.parse(PopularMovieConstants.BASE\uURL)
.buildon()
.appendPath(PopularMovieConstants.MOVIE_APPENDER)
.appendPath(PopularMovieConstants.MOVIE_路径)
.appendPath(Integer.toString(MovieDetails.getId())
.appendPath(PopularMovieConstants.REVIEWS)
.appendQueryParameter(PopularMovieConstants.API_KEY_PARAM,BuildConfig.THE_MOVIE_DB_API_KEY)
.build();
d(Log_标记,builduri.toString());
Request Request=newrequest.Builder()
.url(builtUri.toString())
.build();
OkHttpClient=新的OkHttpClient();
client.newCall(request).enqueue(new Callback()){
@凌驾
public void onFailure(请求,IOException throwable){
printStackTrace();
}
@凌驾
public void onResponse(Response-Response)引发IOException{
如果(!response.issusccessful())
抛出新IOException(“意外代码”+响应);
Gson Gson=新的Gson();
final movieviewsdto reviews=gson.fromJson(response.body().charStream(),MovieReviewsDTO.class);
Log.d(Log_标签“success”);
getActivity().runOnUiThread(新的Runnable()){
@凌驾
公开募捐{
((MovieReviewListAdapter)mAdapter).setGridData(reviews.getResults());
d(Log_标记,“ui”+((MovieReviewListAdapter)mAdapter.getItemCount());
progressBar.setVisibility(View.GONE);
}
});
}
});
}
@凌驾
SaveInstanceState上的公共无效(束超出状态){
outState.putParcelableArrayList(“查看数据”

,(ArrayList我认为问题在于框架布局。这是developer.android.com的声明

"FrameLayout设计用于在屏幕上屏蔽一个区域以显示单个项目。通常,FrameLayout应用于保存单个子视图,因为很难以可扩展到不同屏幕大小的方式组织子视图,而不会使子视图相互重叠。但是,您可以将多个子视图添加到Fram中通过使用android:layou将重力指定给每个子对象,来调整和控制它们在FrameLayout中的位置
<LinearLayout>
     <fragment
        android:id="@+id/fragment_forecast"
        android:name="com.example.android.app.popularmovies.fragmetns.MovieGridFragment"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_weight="2"
        tools:layout="@layout/movie_grid_fragment" />
      <fragment/>
       <fragment/>
   </LinearLayout>