2015-10-18 2 views
1

Я следовал этот учебник по SQLite: https://www.youtube.com/watch?v=3k3CunDZpFk&list=PLshdtb5UWjSrEUEKlfHwqQtYu2HxtCwu_&index=8вопросы Контекст внутри фрагмента (android.view.ContextThemeWrapper не может быть приведен к android.app.Activity)

Я пытающийся делать то, что он сделал, но с фрагмент. У меня возникли проблемы с пониманием ошибки контекста, которую я получаю. Может ли кто-нибудь объяснить это мне?

Если вам нужна дополнительная информация, пожалуйста, не стесняйтесь спрашивать.

Спасибо за ваше время.

10-18 17:33:16.860 7384-7384/com.example.michael.rogplayer E/AndroidRuntime﹕ FATAL EXCEPTION: main 
Process: com.example.michael.rogplayer, PID: 7384 
java.lang.ClassCastException: android.view.ContextThemeWrapper cannot be cast to android.app.Activity 
     at com.example.michael.rogplayer.BackgroundTask.<init>(BackgroundTask.java:20) 
     at com.example.michael.rogplayer.CreateNewChar_Fragment$1.onClick(CreateNewChar_Fragment.java:98) 

Линия 20: activity = (Activity) ctx;

Линия 98: BackgroundTask backgroundTask = new BackgroundTask(getView().getContext());

Вот CreateNewChar_Fragment.java

public class CreateNewChar_Fragment extends DialogFragment { 

private static Activity scanForActivity(Context cont) { 
    if (cont == null) 
     return null; 
    else if (cont instanceof Activity) 
     return (Activity)cont; 
    else if (cont instanceof ContextWrapper) 
     return scanForActivity(((ContextWrapper)cont).getBaseContext()); 

    return null; 
} 

EditText name; 
Button CANCEL, SAVE; 
String NAME; 
Context CTX; 

private static final String ARG_PARAM1 = "param1"; 
private static final String ARG_PARAM2 = "param2"; 

private String mParam1; 
private String mParam2; 

private OnFragmentInteractionListener mListener; 

public static CreateNewChar_Fragment newInstance(String param1, String param2) { 
    CreateNewChar_Fragment fragment = new CreateNewChar_Fragment(); 
    Bundle args = new Bundle(); 
    args.putString(ARG_PARAM1, param1); 
    args.putString(ARG_PARAM2, param2); 
    fragment.setArguments(args); 
    return fragment; 
} 

public CreateNewChar_Fragment() { 

} 

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

    if (getArguments() != null) { 
     mParam1 = getArguments().getString(ARG_PARAM1); 
     mParam2 = getArguments().getString(ARG_PARAM2); 
    } 


} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 

    getDialog().setTitle("State your name!"); 

    return inflater.inflate(R.layout.fragment_create_new_char_, container, false); 

} 



public void onViewCreated(View container, Bundle savedInstanceState) { 
    super.onViewCreated(container, savedInstanceState); 

    CTX = container.getContext(); 
    SAVE = (Button) getView().findViewById(R.id.save); 
    CANCEL = (Button) getView().findViewById(R.id.cancel); 
    name = (EditText) getView().findViewById(R.id.name); 
    NAME = name.getText().toString(); 

    SAVE.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      if (TextUtils.isEmpty(name.getText())) { 
       Toast.makeText(getView().getContext(), "Are you mute!?!?! State your name!!!", 
         Toast.LENGTH_LONG).show(); 
      } else { 
       BackgroundTask backgroundTask = new BackgroundTask(getView().getContext()); 
       backgroundTask.execute("add_info", NAME); 
       getDialog().dismiss(); 
      } 
     } 
    }); 

    CANCEL.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      getDialog().dismiss(); 
     } 
    }); 
} 

public void onButtonPressed(Uri uri) { 
    if (mListener != null) { 
     mListener.onFragmentInteraction(uri); 
    } 
} 

@Override 
public void onAttach(Activity activity) { 
    super.onAttach(activity); 
    try { 
     mListener = (OnFragmentInteractionListener) activity; 
    } catch (ClassCastException e) { 
     throw new ClassCastException(activity.toString() 
       + " must implement OnFragmentInteractionListener"); 
    } 
} 

@Override 
public void onDetach() { 
    super.onDetach(); 
    mListener = null; 
} 

public interface OnFragmentInteractionListener { 
    public void onFragmentInteraction(Uri uri); 
} 
} 

Вот BackgroundTask.java

public class BackgroundTask extends AsyncTask <String,CharacterDisplay,String> { 

Context ctx; 
CharacterAdapter characterAdapter; 
Activity activity; 
ListView listView; 
BackgroundTask(Context ctx) { 
    this.ctx = ctx; 
    activity = (Activity) ctx; 
} 

@Override 
protected void onPreExecute() { 
    super.onPreExecute(); 
} 

@Override 
protected String doInBackground(String... params) { 
    String method = params[0]; 
    DatabaseOperations databaseOperations = new DatabaseOperations(ctx); 

    if (method.equals("add_info")) { 
     String name = params[1]; 
     SQLiteDatabase db = databaseOperations.getWritableDatabase(); 
     databaseOperations.putInfo(db, name); 
     return "One row inserted"; 

    } else if (method.equals("get_info")) { 
     listView = (ListView) activity.findViewById(R.id.char_list); 
     SQLiteDatabase db = databaseOperations.getReadableDatabase(); 
     Cursor cursor = databaseOperations.getInfo(db); 
     characterAdapter = new CharacterAdapter(ctx, R.layout.display_character_row); 
     String name; 
     while (cursor.moveToNext()) { 
      name = cursor.getString(cursor.getColumnIndex(TableData.TableInfo.NAME)); 
      CharacterDisplay characterDisplay = new CharacterDisplay(name); 
      publishProgress(characterDisplay); 
     } 
     return "get_info"; 
    } 
    return null; 
} 

@Override 
protected void onProgressUpdate(CharacterDisplay... values) { 
    characterAdapter.add(values[0]); 
} 

@Override 
protected void onPostExecute(String result) { 
    if (result.equals("get_info")) { 
     listView.setAdapter(characterAdapter); 
    } else { 
     Toast.makeText(ctx,result, Toast.LENGTH_LONG).show(); 
    } 

} 
} 

Вот CharacterDisplay.java

public class CharacterDisplay { 

private String name; 

public CharacterDisplay(String name) { 
    this.setName(name); 
} 

public String getName() { 
    return name; 
} 

public void setName(String name) { 
    this.name = name; 
} 
} 

Вот CharacterAdapter.java

public class CharacterAdapter extends ArrayAdapter { 
List list = new ArrayList(); 

public CharacterAdapter(Context context, int resource) { 
    super(context, resource); 
} 

public void add(Character object) { 
    list.add(object); 
    super.add(object); 
} 

@Override 
public int getCount() { 
    return list.size(); 
} 

@Override 
public Object getItem(int position) { 
    return list.get(position); 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    View row = convertView; 
    CharacterHolder characterHolder; 
    if(row == null) { 
     LayoutInflater layoutInflater = (LayoutInflater) this.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     row = layoutInflater.inflate(R.layout.display_character_row, parent, false); 
     characterHolder = new CharacterHolder(); 
     characterHolder.tx_name = (TextView) row.findViewById(R.id.char_name); 
     row.setTag(characterHolder); 
    } else { 
     characterHolder = (CharacterHolder) row.getTag(); 
    } 

    CharacterDisplay characterDisplay = (CharacterDisplay) getItem(position); 
    characterHolder.tx_name.setText(characterDisplay.getName().toString()); 
    return row; 
} 

static class CharacterHolder { 
    TextView tx_name; 
} 
} 

ответ

2

Activity расширяет ContextThemeWrapper поэтому исключение литой вызваны тем, что ваш ContextThemeWrapper не является экземпляр Activity. Это может быть другой подкласс или ContextThemeWrapper сам по себе.

Чтобы получить Activity контекст внутри фрагмента можно использовать getActivity() вместо getView().getContext()

+0

Это установило это право! Спасибо! :) – Mikitz06