Fragment kann nicht umgewandelt werden, ein android.app.Aktivität
Erstellte ich eine sehr fragment
zum testen meiner app und ich bekam die folgende Fehlermeldung:
03-28 11:11:58.079: E/AndroidRuntime(11760):
java.lang.RuntimeException: Unable to instantiate activity
ComponentInfo{com.android.demoresponsevision/com.android.demoresponsevision.fragment.BarcodeScreen}:
java.lang.Classcastexception-Fehler:
com.android.demoresponsevision.fragment.BarcodeScreen nicht gegossen werden
zu android.app.Aktivität
Fragment-Code:-
public class BarcodeScreen extends Fragment {
TextView tvStatus;
TextView tvResult;
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.barcode, container, false);
tvStatus = (TextView) view.findViewById(R.id.tvStatus);
tvResult = (TextView) view.findViewById(R.id.tvResult);
Button scanBtn = (Button) view.findViewById(R.id.btnScan);
//in some trigger function e.g. button press within your code you
//should add:
scanBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
try {
Utilites.showToast(getActivity(), "Try");
Intent intent = new Intent(
"com.google.zxing.client.android.SCAN");
intent.putExtra("SCAN_MODE", "QR_CODE_MODE,PRODUCT_MODE");
startActivityForResult(intent, 0);
} catch (Exception e) {
e.printStackTrace();
Toast.makeText(getActivity(), "ERROR:" + e, 1).show();
}
}
});
return view;
}
//In the same activity you’ll need the following to retrieve the results:
public void onActivityResult(int requestCode, int resultCode, Intent intent) {
Toast.makeText(getActivity(), "result ", 1000).show();
if (requestCode == 0) {
if (resultCode == getActivity().RESULT_OK) {
tvStatus.setText(intent.getStringExtra("SCAN_RESULT_FORMAT"));
tvResult.setText(intent.getStringExtra("SCAN_RESULT"));
}
else if (resultCode == getActivity().RESULT_CANCELED) {
tvStatus.setText("Press a button to start a scan.");
tvResult.setText("Scan cancelled.");
}
}
}
}
Dies ist mein Fragment-Aktivität
public class TabActivity extends FragmentActivity implements
OnTabChangeListener {
TextView txt;
private TabHost mTabHost;
private HashMap mapTabInfo = new HashMap();
private TabInfo mLastTab = null;
private class TabInfo {
private String tag;
private Class clss;
private Bundle args;
private Fragment fragment;
TabInfo(String tag, Class clazz, Bundle args) {
this.tag = tag;
this.clss = clazz;
this.args = args;
}
}
class TabFactory implements TabContentFactory {
private final Context mContext;
/** * @param context */
public TabFactory(Context context) {
mContext = context;
}
public View createTabContent(String tag) {
View v = new View(mContext);
v.setMinimumWidth(0);
v.setMinimumHeight(0);
return v;
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.tabs);
//Step 2: Setup TabHost
initialiseTabHost(savedInstanceState);
if (savedInstanceState != null) {
mTabHost.setCurrentTabByTag(savedInstanceState.getString("tab"));
}
}
protected void onSaveInstanceState(Bundle outState) {
outState.putString("tab", mTabHost.getCurrentTabTag()); //save the tab
//selected
super.onSaveInstanceState(outState);
}
/**
* Step 2: Setup TabHost
*/
private void initialiseTabHost(Bundle args) {
mTabHost = (TabHost) findViewById(android.R.id.tabhost);
mTabHost.setup();
TabInfo tabInfo = null;
TabActivity.addTab(this, this.mTabHost, this.mTabHost
.newTabSpec("Tab1").setIndicator("HomeScreen"),
(tabInfo = new TabInfo("Tab1", HomeScreen.class, args)));
this.mapTabInfo.put(tabInfo.tag, tabInfo);
TabActivity.addTab(this, this.mTabHost, this.mTabHost
.newTabSpec("Tab2").setIndicator("SecondScreen"),
(tabInfo = new TabInfo("Tab2", SecondHomeScreen.class, args)));
this.mapTabInfo.put(tabInfo.tag, tabInfo);
//Default to first tab
this.onTabChanged("Tab1");
//
mTabHost.setOnTabChangedListener((OnTabChangeListener) this);
}
private static void addTab(TabActivity activity, TabHost tabHost,
TabHost.TabSpec tabSpec, TabInfo tabInfo) { //Attach a Tab view
//factory to the spec
tabSpec.setContent(activity.new TabFactory(activity));
String tag = tabSpec.getTag();
//Check to see if we already have a fragment for this tab, probably
//from a previously saved state. If so, deactivate it, because our
//initial state is that a tab isn't shown.
tabInfo.fragment = activity.getSupportFragmentManager()
.findFragmentByTag(tag);
if (tabInfo.fragment != null && !tabInfo.fragment.isDetached()) {
FragmentTransaction ft = activity.getSupportFragmentManager()
.beginTransaction();
ft.detach(tabInfo.fragment);
ft.commit();
activity.getSupportFragmentManager().executePendingTransactions();
}
tabHost.addTab(tabSpec);
}
/**
* (non-Javadoc) * @see
* android.widget.TabHost.OnTabChangeListener#onTabChanged(java.lang.String)
*/
public void onTabChanged(String tag) {
TabInfo newTab = (TabInfo) this.mapTabInfo.get(tag);
if (mLastTab != newTab) {
FragmentTransaction ft = this.getSupportFragmentManager()
.beginTransaction();
if (mLastTab != null) {
if (mLastTab.fragment != null) {
ft.detach(mLastTab.fragment);
}
}
if (newTab != null) {
if (newTab.fragment == null) {
newTab.fragment = Fragment.instantiate(this,
newTab.clss.getName(), newTab.args);
ft.add(R.id.realtabcontent, newTab.fragment, newTab.tag);
} else {
ft.attach(newTab.fragment);
}
}
mLastTab = newTab;
ft.commit();
this.getSupportFragmentManager().executePendingTransactions();
}
}
}
HomeScreen :-
public class HomeScreen extends Fragment implements OnItemClickListener {
ListView list;
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.home, container, false);
list = (ListView) view.findViewById(R.id.list);
String[] values = new String[] { "Barcode scanner", "Photos ", "Map",
"Signature" };
ArrayAdapter<String> files = new ArrayAdapter<String>(getActivity(),
android.R.layout.simple_list_item_1, values);
list.setAdapter(files);
list.setOnItemClickListener(this);
return view;
}
@Override
public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
if (position == 0) {
Utilites.showToast(getActivity(), "Barcode");
Intent i_barcode = new Intent(getActivity(), BarcodeScreen.class);
startActivity(i_barcode);
}
if (position == 1) {
Utilites.showToast(getActivity(), "Photos");
Intent i_photo = new Intent(getActivity(), PhotoScreen.class);
startActivity(i_photo);
}
if (position == 2) {
Utilites.showToast(getActivity(), "Map");
Intent i_map = new Intent(getActivity(), MapScreen.class);
startActivity(i_map);
}
if (position == 3) {
Utilites.showToast(getActivity(), "Signature");
Intent i_signature = new Intent(getActivity(), BarcodeScreen.class);
startActivity(i_signature);
}
}
}
- können Sie die Aktivität code
- Meine Liebe, ich bin mit Fragmenten..
- In der Aktivität bin ich mit dem tabhost
- Sehr geehrte Fragment wird gehostet von-a-Aktivität, und es sieht aus wie Sie mit startActivity für die Fragmente
- Sie haben, um eine Aktivität Klasse. Sie können nicht direkt nennen fragment als eine Aktivität.
- und in dem manifest Sie einen Eintrag für das fragment??
- Raghunandan :- ja, ich hatte
- so falsch. Siehe mein Beitrag
- Aber wenn ich das überprüfen ohne die Deklaration im manifest dann auch gleich-Ausnahme tritt auf,...,, warum ist das so??
Du musst angemeldet sein, um einen Kommentar abzugeben.
Diese stakctrace zeigt deutlich, dass
BarcodeScreen
ist nicht einActivity
.Sind Sie mit startActivity für die Fragmente einige, wo in Ihrem code.
Problem bestätigt durch folgenden code
Und Sie sagten auch, dass Sie eine Eingabe gemacht haben, von
BarcodeScreen
im manifest. Fragment ist nicht eine Aktivität. Also, was Sie tun, ist falsch.Benötigen Sie einen container, der mit einem
ViewGroup
und hinzufügen oder ersetzen, Fragmente zu.Lesen
http://developer.android.com/guide/components/fragments.html
Intent i_barcode = new Intent(getActivity(), BarcodeScreen.class); startActivity(i_barcode);
. Wenn Sie meinen post gelesen hätten Sie verstehen, dassBarcodeScreen
ist einFragment
und Sie können nichtstartActivtiy
wie würden Sie für Aktivitäten