2012-02-03 6 views
0

다른 조각으로 대체해야하는 조각보기가 있습니다.조각 오류 - ListFragment를 android.app.Activity로 캐스팅 할 수 없습니다.

ListFragment 항목이 선택되면, DetailsFragment는 Extras를 활동의 새 ListFragment (또는 두 번째 ListFragment)로 전달하여 다른 ListFragment로 대체됩니다. 내 문제는 "의도가 {(추가 기능 있음)}"을 처리 할 수있는 활동이 없습니다. ListFragment는 작업이 처음 시작될 때 제대로 작동하지만 세부 활동을 다른 ListFragment로 날짜를 대입 (교체)하면 오류가 발생합니다.

이것은 첫 번째 조각 활동이며 Extras를 조각 사이에 제대로 전달하는 방법을 모르겠습니다. 나는 fragment-manager/transaction 클래스를 적절하게 사용하지 않을 것입니다 (?). 누구든지 내 구현을 수정할 수 있다면 크게 감사하겠습니다.

업데이트 : "i.setClass (getActivity(), ListFragment.class);"를 추가했습니다.

UPDTATE : 2 :하여 ListFragment 클래스의 의도와 지금 로그 오류가 다음과 같이 변경되었습니다에 Devunwired가 sugested으로 나는 인수에 내 의도를 수정하고 지금은 단지 아름답게 작동합니다. Thnx Devunwired. 내가 가지고있는 유일한 문제는 뒤로 키를 눌렀을 때 백 스택이 작동하지 않는다는 것입니다. 수정 된 클래스는 다음과 같습니다 :

로그 캣 (업데이트) :

 FATAL EXCEPTION: main 
java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.andaero.test/com.andaero.test.fragments.ListFragment}: java.lang.ClassCastException: com.andaero.test.fragments.ListFragment cannot be cast to android.app.Activity 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1739) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1831) 
    at android.app.ActivityThread.access$500(ActivityThread.java:122) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1024) 
    at android.os.Handler.dispatchMessage(Handler.java:99) 
    at android.os.Looper.loop(Looper.java:132) 
    at android.app.ActivityThread.main(ActivityThread.java:4123) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:491) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599) 
    at dalvik.system.NativeStart.main(Native Method) 
Caused by: java.lang.ClassCastException: com.andaero.test.fragments.ListFragment cannot be cast to android.app.Activity 

ListFragment 클래스 :

public class ListFragment extends android.app.ListFragment { 

    boolean mDualPane; 
    int mCurCheckPosition = 0; 
    protected TextView activityTitle; 

    boolean mExternalStorageAvailable = false; 
    boolean mExternalStorageWriteable = false; 

    String extStorageDirectory = Environment.getExternalStorageDirectory() 
      .toString(); 
    File dbfile = new File(extStorageDirectory + "/Andaero/dB/Andaero.db"); 
    SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(dbfile, null); 

    private static final String QUERY_KEY = "QUERY_KEY"; 
    private static final String QUERY_ORDER = "QUERY_ORDER"; 

    private View layout; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     layout = inflater.inflate(R.layout.listview, null); 
     return layout; 

    } 

    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 

     Bundle extras = getActivity().getIntent().getExtras(); 
     Bundle arg = this.getArguments();//**ADDED TO GET THE ARGS 

     /** 
     * Get the query string from last activity and pass it to this 
     * activity----------------------------------------------------- 
     */ 
     String q = null; 
     if (extras != null) { 
      q = extras.getString(QUERY_KEY); 
     } 

     if (arg != null) { 
     q = (String) (getArguments() != null ? getArguments().getString(
       "QUERY_KEY") : 1); 
    } 

     loadQuery(q); 
    } 

    public void loadQuery(String q) { 

     if (Environment.getExternalStorageState().equals(
       Environment.MEDIA_MOUNTED)) { 

      String qO = getActivity().getIntent().getStringExtra("QUERY_ORDER"); 
      Cursor c = db.rawQuery(q + " ORDER BY `_id` " + qO, null); 
      setListAdapter(new QueryAdapter(getActivity(), c)); 
      db.close(); 

     } else { 
      Alerts.sdCardMissing(getActivity()); 
     } 
    } 

    public class QueryAdapter extends CursorAdapter { 

     public QueryAdapter(Context context, Cursor c) { 
      super(context, c); 
      LayoutInflater.from(context); 
     } 

     @Override 
     public void bindView(View v, Context context, final Cursor c) { 

      int tvLabel = c.getColumnIndexOrThrow("label"); 
      String label = c.getString(tvLabel); 
      final TextView labelTxt = (TextView) v.findViewById(R.id.label); 

      if (labelTxt != null) { 
       labelTxt.setText("(" + label + ")"); 
      } 

      int tvTitle = c.getColumnIndexOrThrow("title"); 
      final String title = c.getString(tvTitle); 
      TextView titleTxt = (TextView) v.findViewById(R.id.listTitle); 

      if (titleTxt != null) { 
       titleTxt.setText(title); 
      } 

      int tvDescription = c.getColumnIndexOrThrow("description"); 
      String description = c.getString(tvDescription); 
      TextView descriptionTxt = (TextView) v.findViewById(R.id.caption); 

      if (descriptionTxt != null) { 
       descriptionTxt.setText(description); 
      } 

      int tvDate = c.getColumnIndexOrThrow("date"); 
      String date = c.getString(tvDate); 
      TextView dateTxt = (TextView) v.findViewById(R.id.dateAdded); 

      if (dateTxt != null) { 
       dateTxt.setText(date); 
      } 

      int tvGoto = c.getColumnIndexOrThrow("gotoURL"); 
      final String gotoURL = c.getString(tvGoto); 
      TextView gotoTxt = (TextView) v.findViewById(R.id.dummy); 

      if (gotoTxt != null) { 
       gotoTxt.setText(gotoURL); 
      } 

      gotoTxt.setVisibility(View.GONE); 
      v.setTag(gotoURL); 

      final ListView lv = getListView(); 
      lv.setEnabled(true); 
      lv.setClickable(true); 

      lv.setOnItemClickListener(new OnItemClickListener() { 

       public void onItemClick(AdapterView<?> arg0, View v, int arg2, 
         long arg3) { 

        // Create new fragment and transaction 
        Fragment newFragment = new ListFragment(); 
        FragmentTransaction transaction = getFragmentManager() 
          .beginTransaction(); 

        // Replace whatever is in the fragment_container view with 
        // this fragment, 
        // and add the transaction to the back stack 
        transaction.replace(R.id.detailFragment, newFragment); 
        transaction.addToBackStack(null); 

        String url = ""; 
        url = (String) v.getTag(); 

        int nI = c.getColumnIndexOrThrow("intent"); 
        String intent = c.getString(nI); 
        Class<?> myIntent = null; 
        try { 
         myIntent = Class.forName("com.andaero.test.fragments" 
           + intent); 
        } catch (ClassNotFoundException e) { 
         Log.e("ERROR", "Class Not Found for new intent!"); 
         e.printStackTrace(); 
        } 

        int tvTitle = c.getColumnIndexOrThrow("title"); 
        String title = c.getString(tvTitle); 

        int tvLabel = c.getColumnIndexOrThrow("label"); 
        String label = c.getString(tvLabel); 

        String queryKey = "SELECT * FROM " + label; 
        c.close(); 
        db.close(); 

        Bundle args = new Bundle();//**REPLACED THE INTENTS 
        args.putString("QUERY_KEY", queryKey); 
        args.putString("KEY_URL", url); 
        args.putString("KEY_SUBTITLE", title); 
        args.putString("KEY_LABEL", label); 
        args.putString("KEY_INTENT", intent); 
        args.putString("QUERY_ORDER", "ASC"); 

        newFragment.setArguments(args); 

        // Commit the transaction 
        transaction.commit(); 
       } 
      }); 
     } 

     @Override 
     public View newView(Context context, Cursor cursor, ViewGroup parent) { 
      final View v = LayoutInflater.from(context).inflate(
        R.layout.list_item, parent, false); 
      return v; 
     } 
    } 
} 

답변

0

을 위해 무엇을 찾고있는 것 같다,하지만 Activity처럼 다른 하나 개의 인스턴스에서 데이터를 전달하는 IntentFragment 사용하지 않습니다 않습니다. 실제로 을 으로 지정하여 Intent으로 전화하면 원하지 않는 모든 종류의 불꽃 놀이가 발생합니다 (본 것처럼).

생성자의 새 Fragment에 데이터를 전달하는 것이 좋으므로 ListFragment에 전달할 데이터의 매개 변수를 취하는 생성자를 만들 수 있습니다. 또 다른 옵션은 새로운 FragmentBundle에 넣고 Fragment.setArguments()을 사용하여 모든 "추가 기능"을 인수로 설정하는 것입니다. Fragment에 첨부 된 인수에 액세스하려면 언제든지 으로 전화하여 Bundle으로 다시 가져올 수 있습니다. 그러니까 기본적으로, 당신의 onItemClick() 방법에 Intent로 할 필요가 모든 코드를 대체, 대신 :

Bundle args = new Bundle(); 
args.putString("QUERY_KEY", queryKey); 
//...add all the extras to the bundle 

newFragment.setArguments(args); 

transaction.commit(); 

을 또한, 오프 주제,하지만 당신은 당신이 '돈 있도록 다른 뭔가에 Fragment의 이름을 변경 할 수 있습니다 ListFragment과 코드의 플랫폼 버전 간의 차이를 알려면 정규화 된 패키지 이름을 사용해야합니다.

HTH

+0

Thnx가이 문제에 도움을주었습니다. 지금은 오류가 발생하지 않지만 작업이로드되지만 현재 수행중인 모든 데이터가 다시로드됩니다. 클래스가 w/o 파편으로 설정된 경우 새 데이터가 목록에로드되지 않습니다. 더 이상 도움말/포인터. Thnx – CelticParser

+0

다시 도움이 thnx. 내 변경 사항을 살펴보고 Arg을 구현해야하는 더 좋은 방법이 있는지 알아볼 수 있을까요? 또한 왜 내 백 스택이 뒷 키로 작동하지 않는지 알 수 있습니까? – CelticParser

+0

나는 왜 등 작업이 효과가 없는지에 대해 명백한 어떤 것도 보지 못했다. 트랜잭션이 백 스택에 추가되므로 백 버튼을 누르면 마지막 트랜잭션이 이전 상태로 이동합니다. 'super' 또는 다른 표준 동작에 영향을 줄 뭔가를 호출하지 않고 액티비티에서 오버라이드 된'onBackPressed()'를 가지고 있습니까? – Devunwired

0

왜 당신이 때 당신에 값을 전달 생성자를 작성 해달라고 조각을 만드시겠습니까? 그건 당신이 당신은 또 다른 하나의 Fragment를 대체 할 FragmentTransaction를 사용하여 올바른 궤도에있어

+0

파편으로 생성자를 사용하는 것이 좋지 않기 때문에.항상 기본 생성자 (비어 있음)가 필요하거나 복원 할 때 중단됩니다 ... – Warpzit

관련 문제