ClassCastException : Main Activity 必须实现 onFragmentInteractonListener
ClassCastException : Main Activity must implement onFragmentInteractonListener
当我尝试为导航抽屉项目实现 onClick 时,我得到了 ClassCastException。
请在下面找到代码。
我不知道哪里出了问题
主要活动:
public class MainActivity extends AppCompatActivity implements FragmentDrawer.FragmentDrawerListener {
Toolbar toolbar;
ViewPager pager;
ViewPagerAdapter adapter;
SlidingTabLayout tabs;
CharSequence Titles[] = {"CITY", "GO", "NEAR"};
int Numboftabs = 3;
private FragmentDrawer drawerFragment;
private Handler mHandler;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Creating The Toolbar and setting it as the Toolbar for the activity
toolbar = (Toolbar) findViewById(R.id.app_bar);
setSupportActionBar(toolbar);
// Creating The ViewPagerAdapter and Passing Fragment Manager, Titles fot the Tabs and Number Of Tabs.
adapter = new ViewPagerAdapter(getSupportFragmentManager(), Titles, Numboftabs);
// Assigning ViewPager View and setting the adapter
pager = (ViewPager) findViewById(R.id.pager);
pager.setAdapter(adapter);
// Assiging the Sliding Tab Layout View
tabs = (SlidingTabLayout) findViewById(R.id.tabs);
tabs.setDistributeEvenly(true); // To make the Tabs Fixed set this true, This makes the tabs Space Evenly in Available width
// Setting Custom Color for the Scroll bar indicator of the Tab View
tabs.setCustomTabColorizer(new SlidingTabLayout.TabColorizer() {
@Override
public int getIndicatorColor(int position) {
return getResources().getColor(R.color.tabsScrollColor);
}
});
// Setting the ViewPager For the SlidingTabsLayout
tabs.setViewPager(pager);
drawerFragment = (FragmentDrawer)
getSupportFragmentManager().findFragmentById(R.id.fragment_navigation_drawer);
drawerFragment.setUp(R.id.fragment_navigation_drawer, (DrawerLayout) findViewById(R.id.drawer_layout), toolbar);
drawerFragment.setDrawerListener(this);
// display the first navigation drawer view on app launch
displayView(0);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
public void onDrawerItemSelected(View view, final int position) {
displayView(position);
}
private void displayView(int position) {
Fragment fragment = null;
String title = getString(R.string.app_name);
switch (position) {
case 0:
fragment = new ContactFragment();
title = getString(R.string.nav_item_contact);
break;
case 1:
fragment = new MyLocation();
title = getString(R.string.nav_item_myloc);
break;
case 2:
fragment = new TermsandCondition();
title = getString(R.string.nav_item_terms);
break;
case 3:
fragment = new UpgradePlan();
title = getString(R.string.nav_item_upgrade);
break;
case 4:
fragment = new Aboutus();
title = getString(R.string.nav_item_about);
break;
default:
break;
}
if (fragment != null) {
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
// fragmentTransaction.setCustomAnimations(android.R.anim.fade_in,android.R.anim.fade_out,android.R.anim.fade_in,android.R.anim.fade_out);
fragmentManager.addOnBackStackChangedListener(null);
fragmentTransaction.replace(R.id.container_body, fragment);
fragmentTransaction.commit();
// set the toolbar title
// actionBar.setTitle(Html.fromHtml("<font color='#ff0000'>ActionBartitle </font>"));
getSupportActionBar().setTitle(Html.fromHtml("<font color='#000000'>" + title + " </font>"));
// final Drawable upArrow = getResources().getDrawable(R.drawable.abc_ic_ab_back_mtrl_am_alpha);
// upArrow.setColorFilter(getResources().getColor(R.color.grey), PorterDuff.Mode.SRC_ATOP);
// getSupportActionBar().setHomeAsUpIndicator(upArrow);
}
}
}
联系片段:
public class ContactFragment extends Fragment {
// TODO: Rename parameter arguments, choose names that match
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
private static final String ARG_PARAM1 = "param1";
private static final String ARG_PARAM2 = "param2";
// TODO: Rename and change types of parameters
private String mParam1;
private String mParam2;
private OnFragmentInteractionListener mListener;
// TODO: Rename and change types and number of parameters
public static ContactFragment newInstance(String param1, String param2) {
ContactFragment fragment = new ContactFragment();
Bundle args = new Bundle();
args.putString(ARG_PARAM1, param1);
args.putString(ARG_PARAM2, param2);
fragment.setArguments(args);
return fragment;
}
public ContactFragment() {
// Required empty public constructor
}
@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) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_contact, container, false);
}
// TODO: Rename method, update argument and hook method into UI event
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 {
// TODO: Update argument type and name
public void onFragmentInteraction(Uri uri);
}
}
Logcat:
java.lang.ClassCastException: keleno.example.ramz.mapper_city.MainActivity@21c6ea2b must implement OnFragmentInteractionListener
10-16 11:28:13.664 28882-28882/keleno.example.ramz.mapper_city E/AndroidRuntime: at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2339)
10-16 11:28:13.664 28882-28882/keleno.example.ramz.mapper_city E/AndroidRuntime: at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2413)
10-16 11:28:13.664 28882-28882/keleno.example.ramz.mapper_city E/AndroidRuntime: at android.app.ActivityThread.access0(ActivityThread.java:155)
10-16 11:28:13.664 28882-28882/keleno.example.ramz.mapper_city E/AndroidRuntime: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1317)
10-16 11:28:13.664 28882-28882/keleno.example.ramz.mapper_city E/AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:102)
10-16 11:28:13.664 28882-28882/keleno.example.ramz.mapper_city E/AndroidRuntime: at android.os.Looper.loop(Looper.java:135)
10-16 11:28:13.664 28882-28882/keleno.example.ramz.mapper_city E/AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:5343)
10-16 11:28:13.664 28882-28882/keleno.example.ramz.mapper_city E/AndroidRuntime: at java.lang.reflect.Method.invoke(Native Method)
10-16 11:28:13.664 28882-28882/keleno.example.ramz.mapper_city E/AndroidRuntime: at java.lang.reflect.Method.invoke(Method.java:372)
10-16 11:28:13.664 28882-28882/keleno.example.ramz.mapper_city E/AndroidRuntime: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:905)
10-16 11:28:13.664 28882-28882/keleno.example.ramz.mapper_city E/AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:700)
10-16 11:28:13.664 28882-28882/keleno.example.ramz.mapper_city E/AndroidRuntime: Caused by: java.lang.ClassCastException: keleno.example.ramz.mapper_city.MainActivity@21c6ea2b must implement OnFragmentInteractionListener
10-16 11:28:13.664 28882-28882/keleno.example.ramz.mapper_city E/AndroidRuntime: at keleno.example.ramz.mapper_city.fragment.ContactFragment.onAttach(ContactFragment.java:85)
感谢任何帮助!!
解决方案
将此添加到您的 MainActivity
public class MainActivity extends AppCompatActivity implements FragmentDrawer.FragmentDrawerListener,ContactFragment.OnFragmentInteractionListener {
并在MainActivity
中覆盖public void onFragmentInteraction(Uri uri)
中的方法
发生此错误是因为您没有在托管 Fragments
的 Activity
中实施 interface
。您将需要实施所有 Fragments
中的 interface
。
说明
您可以在 Fragment
的 onAttach()
中看到这一点,您可以在其中编写条件以查看 Hosting Activity 是否已实施基础 Fragment Interface
.
如果您不打算使用 callbacks
和其他东西,那么理想的建议是从 fragment
中删除 interface
,否则继续实现接口。
您可以询问是否需要进一步的解释。
是的,我想建议阅读以下内容以更广泛地了解 Fragments
内容,
Fragment Basics
您正在使用片段中的接口将值(它可能是您单击的片段中的视图)从片段传递到 activity。
如果您不需要将任何此类值从片段传递到您的 activity,您可以删除它们,否则您可以将片段中的值传递到其接口中的方法并且您可以重写activity 中的那个方法访问那个 parameters.Here 因为你不需要将任何东西从你的片段传递到 activity,你可以从你的片段中删除接口。你所有的片段都是一样的。
当我尝试为导航抽屉项目实现 onClick 时,我得到了 ClassCastException。
请在下面找到代码。
我不知道哪里出了问题
主要活动:
public class MainActivity extends AppCompatActivity implements FragmentDrawer.FragmentDrawerListener {
Toolbar toolbar;
ViewPager pager;
ViewPagerAdapter adapter;
SlidingTabLayout tabs;
CharSequence Titles[] = {"CITY", "GO", "NEAR"};
int Numboftabs = 3;
private FragmentDrawer drawerFragment;
private Handler mHandler;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Creating The Toolbar and setting it as the Toolbar for the activity
toolbar = (Toolbar) findViewById(R.id.app_bar);
setSupportActionBar(toolbar);
// Creating The ViewPagerAdapter and Passing Fragment Manager, Titles fot the Tabs and Number Of Tabs.
adapter = new ViewPagerAdapter(getSupportFragmentManager(), Titles, Numboftabs);
// Assigning ViewPager View and setting the adapter
pager = (ViewPager) findViewById(R.id.pager);
pager.setAdapter(adapter);
// Assiging the Sliding Tab Layout View
tabs = (SlidingTabLayout) findViewById(R.id.tabs);
tabs.setDistributeEvenly(true); // To make the Tabs Fixed set this true, This makes the tabs Space Evenly in Available width
// Setting Custom Color for the Scroll bar indicator of the Tab View
tabs.setCustomTabColorizer(new SlidingTabLayout.TabColorizer() {
@Override
public int getIndicatorColor(int position) {
return getResources().getColor(R.color.tabsScrollColor);
}
});
// Setting the ViewPager For the SlidingTabsLayout
tabs.setViewPager(pager);
drawerFragment = (FragmentDrawer)
getSupportFragmentManager().findFragmentById(R.id.fragment_navigation_drawer);
drawerFragment.setUp(R.id.fragment_navigation_drawer, (DrawerLayout) findViewById(R.id.drawer_layout), toolbar);
drawerFragment.setDrawerListener(this);
// display the first navigation drawer view on app launch
displayView(0);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
public void onDrawerItemSelected(View view, final int position) {
displayView(position);
}
private void displayView(int position) {
Fragment fragment = null;
String title = getString(R.string.app_name);
switch (position) {
case 0:
fragment = new ContactFragment();
title = getString(R.string.nav_item_contact);
break;
case 1:
fragment = new MyLocation();
title = getString(R.string.nav_item_myloc);
break;
case 2:
fragment = new TermsandCondition();
title = getString(R.string.nav_item_terms);
break;
case 3:
fragment = new UpgradePlan();
title = getString(R.string.nav_item_upgrade);
break;
case 4:
fragment = new Aboutus();
title = getString(R.string.nav_item_about);
break;
default:
break;
}
if (fragment != null) {
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
// fragmentTransaction.setCustomAnimations(android.R.anim.fade_in,android.R.anim.fade_out,android.R.anim.fade_in,android.R.anim.fade_out);
fragmentManager.addOnBackStackChangedListener(null);
fragmentTransaction.replace(R.id.container_body, fragment);
fragmentTransaction.commit();
// set the toolbar title
// actionBar.setTitle(Html.fromHtml("<font color='#ff0000'>ActionBartitle </font>"));
getSupportActionBar().setTitle(Html.fromHtml("<font color='#000000'>" + title + " </font>"));
// final Drawable upArrow = getResources().getDrawable(R.drawable.abc_ic_ab_back_mtrl_am_alpha);
// upArrow.setColorFilter(getResources().getColor(R.color.grey), PorterDuff.Mode.SRC_ATOP);
// getSupportActionBar().setHomeAsUpIndicator(upArrow);
}
}
}
联系片段:
public class ContactFragment extends Fragment {
// TODO: Rename parameter arguments, choose names that match
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
private static final String ARG_PARAM1 = "param1";
private static final String ARG_PARAM2 = "param2";
// TODO: Rename and change types of parameters
private String mParam1;
private String mParam2;
private OnFragmentInteractionListener mListener;
// TODO: Rename and change types and number of parameters
public static ContactFragment newInstance(String param1, String param2) {
ContactFragment fragment = new ContactFragment();
Bundle args = new Bundle();
args.putString(ARG_PARAM1, param1);
args.putString(ARG_PARAM2, param2);
fragment.setArguments(args);
return fragment;
}
public ContactFragment() {
// Required empty public constructor
}
@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) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_contact, container, false);
}
// TODO: Rename method, update argument and hook method into UI event
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 {
// TODO: Update argument type and name
public void onFragmentInteraction(Uri uri);
}
}
Logcat:
java.lang.ClassCastException: keleno.example.ramz.mapper_city.MainActivity@21c6ea2b must implement OnFragmentInteractionListener
10-16 11:28:13.664 28882-28882/keleno.example.ramz.mapper_city E/AndroidRuntime: at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2339)
10-16 11:28:13.664 28882-28882/keleno.example.ramz.mapper_city E/AndroidRuntime: at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2413)
10-16 11:28:13.664 28882-28882/keleno.example.ramz.mapper_city E/AndroidRuntime: at android.app.ActivityThread.access0(ActivityThread.java:155)
10-16 11:28:13.664 28882-28882/keleno.example.ramz.mapper_city E/AndroidRuntime: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1317)
10-16 11:28:13.664 28882-28882/keleno.example.ramz.mapper_city E/AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:102)
10-16 11:28:13.664 28882-28882/keleno.example.ramz.mapper_city E/AndroidRuntime: at android.os.Looper.loop(Looper.java:135)
10-16 11:28:13.664 28882-28882/keleno.example.ramz.mapper_city E/AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:5343)
10-16 11:28:13.664 28882-28882/keleno.example.ramz.mapper_city E/AndroidRuntime: at java.lang.reflect.Method.invoke(Native Method)
10-16 11:28:13.664 28882-28882/keleno.example.ramz.mapper_city E/AndroidRuntime: at java.lang.reflect.Method.invoke(Method.java:372)
10-16 11:28:13.664 28882-28882/keleno.example.ramz.mapper_city E/AndroidRuntime: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:905)
10-16 11:28:13.664 28882-28882/keleno.example.ramz.mapper_city E/AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:700)
10-16 11:28:13.664 28882-28882/keleno.example.ramz.mapper_city E/AndroidRuntime: Caused by: java.lang.ClassCastException: keleno.example.ramz.mapper_city.MainActivity@21c6ea2b must implement OnFragmentInteractionListener
10-16 11:28:13.664 28882-28882/keleno.example.ramz.mapper_city E/AndroidRuntime: at keleno.example.ramz.mapper_city.fragment.ContactFragment.onAttach(ContactFragment.java:85)
感谢任何帮助!!
解决方案
将此添加到您的 MainActivity
public class MainActivity extends AppCompatActivity implements FragmentDrawer.FragmentDrawerListener,ContactFragment.OnFragmentInteractionListener {
并在MainActivity
public void onFragmentInteraction(Uri uri)
中的方法
发生此错误是因为您没有在托管 Fragments
的 Activity
中实施 interface
。您将需要实施所有 Fragments
中的 interface
。
说明
您可以在 Fragment
的 onAttach()
中看到这一点,您可以在其中编写条件以查看 Hosting Activity 是否已实施基础 Fragment Interface
.
如果您不打算使用 callbacks
和其他东西,那么理想的建议是从 fragment
中删除 interface
,否则继续实现接口。
您可以询问是否需要进一步的解释。
是的,我想建议阅读以下内容以更广泛地了解 Fragments
内容,
Fragment Basics
您正在使用片段中的接口将值(它可能是您单击的片段中的视图)从片段传递到 activity。
如果您不需要将任何此类值从片段传递到您的 activity,您可以删除它们,否则您可以将片段中的值传递到其接口中的方法并且您可以重写activity 中的那个方法访问那个 parameters.Here 因为你不需要将任何东西从你的片段传递到 activity,你可以从你的片段中删除接口。你所有的片段都是一样的。