2017-03-08 5 views
4

現在、「アクティビティはインターフェイスにキャストできません」という理由で、アンドロイドアプリでClassCastExceptionが発生しています。 ここに私のコードはあります:アクティビティをInterface(ClassCastException)にキャストすることはできません

Logcatは、 "this.clickListener =(clickInterfaceHelper)context;"という行のMovieGridFragmentのonAttach部分に例外がスローされたと報告しています。

マイインタフェース:

public interface clickInterfaceHelper { 
void clickOnItem(int id); 
void favoriteMovieItem(int movieId); } 

断片クラス:

public class MovieGridFragment extends Fragment { 

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

public MovieGridFragment() {} //empty constructor 

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

@Override 
public void onCreate(@Nullable Bundle savedInstanceState) { 
    if(savedInstanceState != null) { 
     if (!movieDataList.isEmpty()) { 
      movieDataList = Arrays.asList((movieData[]) savedInstanceState.getSerializable("OLDMOVIEDATA")); 
     } 
    } 
    super.onCreate(savedInstanceState); 
} 

MainActivity:

@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); 
    movieAdapter adapter = new movieAdapter(getActivity(),movieDataList); 
    adapter.notifyDataSetChanged(); 
    movieGridView.setAdapter(adapter); 
    movieGridView.setSelection(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) { 
    index = movieGridView.getFirstVisiblePosition(); 
    outState.putSerializable("OLDMOVIEDATA",movieData.movieDataArray); 
    super.onSaveInstanceState(outState); 
}} 
and 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) { 
       getSupportFragmentManager().beginTransaction() 
       .add(R.id.activity_container, new MovieGridFragment()) 
       .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() { 
     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.setPosition(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; 
        } 

        MovieGridFragment gridFragment = new MovieGridFragment(); 
        gridFragment.movieDataList = Arrays.asList(movieData.movieDataArray); //hier wird datalist eigentlich zugewiesen 
        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); 
} } 

答えて

3

にあなたが得るこの

this.clickListener = (MainActivity) getActivity(); 

を試すことができます動作しない場合があります(といくつかのOSのバージョンではなく他人に取り組むこと)は、明示的にキャストする必要があるだろう

public void setListener(clickInterfaceHelper listener) { 
    this.clickListener = listener; 
} 
:私はあなたのようなあなたのフラグメントに機能を追加することをお勧め

:あなたのMainActivity

EDITにそれをFragmentActivityとキャスト

そして、あなたの活動で:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    if(savedInstanceState == null) { 
    MovieGridFragment fragment = new MovieGridFragment(); 
    fragment.setListener(this); // some change here 
       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(); 
     } 
    } 

} 

.... no relevant functions 


public void movieRequest() { 
     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.setPosition(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; 
        } 

        MovieGridFragment gridFragment = new MovieGridFragment(); 
        gridfragment.setListener(this); // some change here 
        gridFragment.movieDataList = Arrays.asList(movieData.movieDataArray); //hier wird datalist eigentlich zugewiesen 
        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); 

} 

は、この情報がお役に立てば幸いです。

+1

悲しいことに、まだClassCastExceptionを取得していません。 – Torben

+0

@Torben自分の編集が役立つかどうかを確認してください。 – Cochi

3

に渡されたコンテキストは、必ずしもあなたの活動ではありません。それは、さまざまなテーマやその他のオーバーライドを含むラッパーです。コンテキストを渡すと、アクティビティが渡されることは決して想像できません。クリックハンドラへの参照が必要な場合は、setClickHandler関数を記述して明示的に呼び出します。

アクティビティであっても、アプリケーションはその時点のコンテキストを認識しません。あなたが原因段落1

0

フラグメントクラス内にインターフェイスを配置してください。

public class MovieGridFragment extends Fragment { 
    public clickInterfaceHelper clickListener; 
    private int index; 
    private GridView movieGridView; 
    public List<movieData> movieDataList = new ArrayList<>(); 

    public MovieGridFragment() {} //empty constructor 

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

    @Override 
    public void onCreate(@Nullable Bundle savedInstanceState) { 
    if(savedInstanceState != null) { 
     if (!movieDataList.isEmpty()) { 
      movieDataList = Arrays.asList((movieData[]) savedInstanceState.getSerializable("OLDMOVIEDATA")); 
     } 
    } 
    super.onCreate(savedInstanceState); 
    } 

    public interface clickInterfaceHelper { 
    void clickOnItem(int id); 
    void favoriteMovieItem(int movieId); 
    } 
} 
+0

まだ私にクラッシュを与えます – Torben

関連する問題