2017-03-12 29 views
1

他のバグを修正した後、私のコードの問題が発生しました。映画の詳細情報を表示する必要がある私の活動は、代わりに正しく表示されず、空白のアクティビティが開きます。アクティビティがonClickに表示されない

私のディテール活動:

public class detailsActivity extends AppCompatActivity { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_details); 

    Intent intent = getIntent(); 
    String fragment = intent.getExtras().getString("FRAGMENT"); 
    if(fragment.equals("MOVIE")) { 
     MovieGridFragment frag = new MovieGridFragment(); 
     getSupportFragmentManager().beginTransaction().replace(R.id.fl_detail_fragment,frag).commit(); 
    } else { 
     getFragmentManager().beginTransaction().replace(R.id.fl_detail_fragment, new displayMovieDetails()).commit(); 
    } 
}} 

mainActivity:

public class MainActivity extends AppCompatActivity implements clickInterfaceHelper { 

    public static String sorterString = null; 
    public static String urlBase = "https://api.themoviedb.org/3/movie/"; 
    public static String urlFinal = null; 

    RequestQueue requestQueue; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     if(savedInstanceState == null) { 
      MovieGridFragment fragment = new MovieGridFragment(); 
        fragment.setClickListener(this); 
        getSupportFragmentManager().beginTransaction() 
        .add(R.id.activity_container, fragment) 
        .commit(); 
      movieData.movieDataPosition = 0; 
     } 
     if(savedInstanceState != null) { 
      sorterString = savedInstanceState.getString("SORTER"); 
     } 

     if(savedInstanceState == null) 
      movieData.movieDataPosition = 0; 

     if(sorterString==null) 
      sorterString="popular?"; 
     if(sorterString!="favorite" && sorterString!=null) { 
      if(networkChecker.isNetworkAvailableChecker(this)) { 
       movieRequest(); 
      } 
     } 



    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.main_menu_act, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     int id = item.getItemId(); 

     if(id == R.id.m_popularity_action) { 
      if(sorterString != "popular?") { 
       sorterString = "popular?"; 
       if(networkChecker.isNetworkAvailableChecker(this)) 
       movieRequest(); 
      } 
      return true; 
     } 

     if(id == R.id.m_action_voter) { 
      if(sorterString != "top_rated?") { 
       sorterString = "top_rated?"; 
       if(networkChecker.isNetworkAvailableChecker(this)) 
       movieRequest(); 
      } 
      return true; 
     } 

     if(id == R.id.m_favorite_btn) { 
      if(sorterString != "favorite") { 
       SQLiteOpenHelper helper = new movieDataDbHelper(this); 
       SQLiteDatabase database = helper.getReadableDatabase(); 
       Cursor cursor= database.query(movieDataContract.contractEntry.TABLE_NAME, 
         new String[] { 
           movieDataContract.contractEntry.ID, 
           movieDataContract.contractEntry.IMG_PATH},null,null,null,null,null); 
       if(cursor.getCount() == 0) { 
        Toast.makeText(this, "there are no favorite movies yet!",Toast.LENGTH_SHORT).show(); 
       } else { 
        sorterString = "favorite"; 
        showFavoriteFragment(); 
       } 
       database.close(); 
       helper.close(); 
       cursor.close(); 
      } 
      return true; 
     } 
     return super.onOptionsItemSelected(item); 
    } 

    public void showFavoriteFragment() { 
     favoriteMoviesDetailsFragment fragment = new favoriteMoviesDetailsFragment(); 
     try { 
      getFragmentManager().beginTransaction().replace(R.id.activity_container,fragment).commit(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    @Override 
    public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) { 
     outState.putString("SORTER", sorterString); 
     outState.putInt("POSITION",movieData.movieDataPosition); 
     super.onSaveInstanceState(outState, outPersistentState); 
    } 

    public void movieRequest() { 
     final MovieGridFragment gridFragment = new MovieGridFragment(); 
     gridFragment.setClickListener(this); 
      urlFinal = urlBase + sorterString + movieData.apiKey; 
      urlFinal.trim(); 
      requestQueue = Volley.newRequestQueue(this); 
      JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.GET, urlFinal, null, new Response.Listener<JSONObject>() { 
       @Override 
       public void onResponse(JSONObject response) { 
        try { 
         JSONArray array = response.getJSONArray("results"); 
         movieData.movieDataArray = new movieData[array.length()]; 

         for (int i = 0; i < array.length(); i++) { 
          movieData movie = new movieData(); 
          JSONObject jsonObject = array.getJSONObject(i); 
          movie.setMovieId(jsonObject.getString("id")); 
          movie.setMovieImagePath(jsonObject.getString("poster_path")); 
          movie.setMovieTitle(jsonObject.getString("original_title")); 
          movie.setMoviePlot(jsonObject.getString("overview")); 
          movie.setMovieVoting(jsonObject.getString("vote_average")); 
          movie.setMovieReleaseDate(jsonObject.getString("release_date")); 
          movieData.movieDataArray[i] = movie; 
         } 


         gridFragment.movieDataList = Arrays.asList(movieData.movieDataArray); 
         FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); 
         transaction.replace(R.id.activity_container, gridFragment); 
         try { 
          transaction.commitAllowingStateLoss(); 
         } catch (Exception e) { 
          e.printStackTrace(); 
         } 
        } catch (JSONException e) { 
         e.printStackTrace(); 
        } 
       } 
      }, new Response.ErrorListener() { 
       @Override 
       public void onErrorResponse(VolleyError error) { 
        Log.e("volley", String.valueOf(error)); 
       } 
      } 
      ); 
      requestQueue.add(jsonObjectRequest); 

    } 

    @Override 
    public void clickOnItem(int id) { 
     movieData.movieDataPosition = id; 
     if(movieData.movieDataArray == null) { 
      movieRequest(); 
     } else { 
      Intent intent = new Intent(this, detailsActivity.class); 
      intent.putExtra("FRAGMENT","MOVIE"); 
      startActivity(intent); 
     } 

    } 

    @Override 
    public void favoriteMovieItem(int movieId) { 
     movieData.dbPosition = movieId; 

     Intent intent = new Intent(this,detailsActivity.class); 
     intent.putExtra("FRAGMENT","favorite"); 
     startActivity(intent); 
    } 
} 

とデータが表示されますmovieFragment:

public class MovieGridFragment extends Fragment { 

    public clickInterfaceHelper clickListener; 
    private GridView movieGridView; 
    private int index; 
    public List<movieData> movieDataList = new ArrayList<>(); 

    public MovieGridFragment() {} //empty constructor 

    @Override 
    public void onAttach(Context context) { 
     //this.clickListener = (clickInterfaceHelper) context; 
     super.onAttach(context); 
    } 

    public void setClickListener(clickInterfaceHelper listener) { 
     this.clickListener = listener; 
    } 

    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     setHasOptionsMenu(true); 

     if(movieDataList.isEmpty() && networkChecker.isNetworkAvailableChecker(getContext())) { 
      movieDataList = new ArrayList<movieData>(); 
     } 

     if(!movieDataList.isEmpty() && !networkChecker.isNetworkAvailableChecker(getContext())) { 
      movieDataList = new ArrayList<movieData>(); 
     } 

     if(savedInstanceState != null) { 
      index = savedInstanceState.getInt("INDEX"); 
      if(movieDataList.isEmpty()) { 
       movieDataList.addAll(Arrays.asList((movieData[]) savedInstanceState.getSerializable("OLDMOVIEDATA"))); 
      } 
     } 

     View rootView = inflater.inflate(R.layout.movie_display_fragment, container, false); 

     movieGridView = (GridView) rootView.findViewById(R.id.gv_movie_display); 
     movieAdapter adapter = new movieAdapter(getActivity(),movieDataList); 
     adapter.notifyDataSetChanged(); 
     movieGridView.setAdapter(adapter); 
     movieGridView.smoothScrollToPosition(index); 
     movieGridView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 

      @Override 
      public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
       if(clickListener != null) 
         clickListener.clickOnItem(position); 

      } 
     }); 
     return rootView; 
    } 

    @Override 
    public void onSaveInstanceState(Bundle outState) { 
     outState.putSerializable("OLDMOVIEDATA",movieData.movieDataArray); 
     outState.putInt("INDEX",movieGridView.getFirstVisiblePosition()); 
     super.onSaveInstanceState(outState); 
    } 


} 

activity_detailsレイアウト:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:orientation="vertical" android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    tools:context=".detailsActivity"> 

    <FrameLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:id="@+id/fl_detail_fragment"> 
    </FrameLayout> 
</LinearLayout> 
+0

質問する前にデバッガでそれを実行しましたか? – Shark

+0

R.layout.activity_detailsのコードを追加 – MarcGV

+0

私はデバッガでそれを実行しましたが、問題を見つけることができませんでした。 movierequestが動作し、フラグメントを埋めるためのデータがある – Torben

答えて

-1

私はvですエリーあなたの努力のために申し訳ありませんが、私はちょうど愚かなばかだ... 私は間違った断片を開いた....

0

インテントエクストラには固有の識別子を付ける必要がありますが、これが問題の原因かどうかはわかりません。

1

getSupportFragmentManager().beginTransaction().add()を初めて使用する必要があります。

次にあなたがgetSupportFragmentManager().beginTransaction().replace()

EDIT

public class MovieGridFragment extends Fragment { 

    public clickInterfaceHelper clickListener; 
    private GridView movieGridView; 
    private int index; 
    public List<movieData> movieDataList = new ArrayList<>(); 


    public void setMovieDataList(List<movieData> movieDataList) { 
     this.movieDataList = movieDataList; 
    } 

    public void setClickListener(clickInterfaceHelper listener) { 
     this.clickListener = listener; 
    } 

    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     setHasOptionsMenu(true); 
     View rootView = inflater.inflate(R.layout.movie_display_fragment, container, false); 
     movieGridView = (GridView) rootView.findViewById(R.id.gv_movie_display); 

     if (movieDataList != null) { 
      initMovieGrid(); 
     } 
     return rootView; 
    } 

    private void initMovieGrid() { 
     movieAdapter adapter = new movieAdapter(getActivity(), movieDataList); 
     adapter.notifyDataSetChanged(); 
     movieGridView.setAdapter(adapter); 
     movieGridView.smoothScrollToPosition(index); 
     movieGridView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
       if (clickListener != null) 
        clickListener.clickOnItem(position); 

      } 
     }); 
    } 
} 

フラグメントを使用するために使用する前に、フラグメントを追加したとき:あなたがリストを持っていない場合

MovieGridFragment fragment = new MovieGridFragment(); 
fragment.setClickListener(this); 
fragment.setMovieDataList(movieDataList); 
getSupportFragmentManager().beginTransaction() 
     .add(R.id.activity_container, fragment).commit(); 

をあなたのフラグメントを使用する前に、このコードをフラグメントに使用することができます:

public class MovieGridFragment extends Fragment { 

    public clickInterfaceHelper clickListener; 
    private GridView movieGridView; 
    private int index; 
    public List<movieData> movieDataList = new ArrayList<>(); 


    public void setMovieDataList(List<movieData> movieDataList) { 
     this.movieDataList = movieDataList; 
     if (movieDataList != null) { 
      initMovieGrid(); 
     } 
    } 

    public void setClickListener(clickInterfaceHelper listener) { 
     this.clickListener = listener; 
    } 

    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     setHasOptionsMenu(true); 
     View rootView = inflater.inflate(R.layout.movie_display_fragment, container, false); 
     movieGridView = (GridView) rootView.findViewById(R.id.gv_movie_display); 
     return rootView; 
    } 

    private void initMovieGrid() { 
     movieAdapter adapter = new movieAdapter(getActivity(), movieDataList); 
     adapter.notifyDataSetChanged(); 
     movieGridView.setAdapter(adapter); 
     movieGridView.smoothScrollToPosition(index); 
     movieGridView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
       if (clickListener != null) 
        clickListener.clickOnItem(position); 

      } 
     }); 
    } 
} 

次に作成setMovieDataList()を使用せずにフラグメントを作成し、動画データを取得するとき、setMovieDataList()

public class MainActivity extends AppCompatActivity implements clickInterfaceHelper { 

    //... 

    MovieGridFragment mFragment; 

    //... 

メソッドを使用します。

mFragment = new MovieGridFragment(); 
fragment.setClickListener(this); 
getSupportFragmentManager().beginTransaction() 
     .add(R.id.activity_container, fragment).commit(); 

を使用すると、データ取得後:

mFragment.setMovieDataList(movieDataList); 
関連する問題