2016-03-05 31 views
2

我想实现一个WifiScanner侦听器到我的ScanFragment,但我收到这个错误:java.lang.ClassCastException: emilsoft.wifitest3.MainActivity cannot be cast to emilsoft.wifitest3.WifiScanner$Listener 我已经做了这与正常的活动,现在我试图将其转换为碎片,我目前正在了解它们。 我做了很多研究,但找不到工作解决方案。我有评论哪里有错误ClassCastException:MainActivity不能转换为侦听器

所以我主要活动代码:

private SectionsPagerAdapter mSectionsPagerAdapter; 
private ViewPager mViewPager; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 
    // Create the adapter that will return a fragment for each of the three 
    // primary sections of the activity. 
    mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager()); 

    // Set up the ViewPager with the sections adapter. 
    mViewPager = (ViewPager) findViewById(R.id.container); 
    mViewPager.setAdapter(mSectionsPagerAdapter); 

    TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs); 
    tabLayout.setupWithViewPager(mViewPager); 

} 

SectionsPagerAdapter类

public class SectionsPagerAdapter extends FragmentPagerAdapter{ 

public SectionsPagerAdapter(FragmentManager fm) { 
    super(fm); 
    } 

@Override 
public Fragment getItem(int position) { 
    switch (position) { 
     case 0: return ScanFragment.newInstance(); 
    } 
    return null; 
} 

ScanFragment

public class ScanFragment extends Fragment implements WifiScanner.Listener { 
    private ScanCollector sc; 
    private WifiManager wifi; 
    public ScanFragment() {} 

    public static ScanFragment newInstance() { 
     return new ScanFragment(); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View result = inflater.inflate(R.layout.fragment_scan_results, container, false); 
     wifi = (WifiManager) getActivity().getSystemService(Context.WIFI_SERVICE); 
     sc = new ScanCollector(this.getContext()); //THE ERROR STARTS HERE 
     return result; 
    } 

ScanCollector类(其中处理听众加入到WifiScanner类):

public class ScanCollector { 

// The context wrapper that we'll use for accessing system services, receiving 
// broadcasts from the WifiManager 
private final Context context; 

private WifiScanner.Listener listener; 

public ScanCollector(Context context) { 
    if (context == null) 
     throw new NullPointerException(); 
    this.context = context; 
    this.listener = (WifiScanner.Listener)context; //THE ERROR IS HERE 
} 

的问题是,我不能正确的上下文传递给我的ScanCollector类,然后将其转换为WifiScanner.Listener。可能是一个非常愚蠢的解决方案,但我找不到它。

在此先感谢!

回答

6

一件事是context,另一个是WifiScanner.Listener。你ScanCollector需求都这么传他们两个:

public ScanCollector(Context context, WifiScanner.Listener listener) { 
    if (context == null) 
     throw new NullPointerException(); 
    this.context = context; 
    this.listener = listener 
} 

而且当你创建:

sc = new ScanCollector(getActivity(), this); 
+1

这工作谢谢! – Automatik

+0

@Pelocho工作的人!!谢谢 –

2

变化

sc = new ScanCollector(this.getContext()); // The fragment's context 

sc = new ScanCollector(getActivity()); // The activity's context 

this.getContext()指片段,其比真正实现Listener接口与主机活动的上下文中不同的当前上下文。

(确保MainActivity implements WifiScanner.Listener

+0

如果你连接监听器'onAttach(...)'? –

+1

他正在将'Context'投射到'WifiScanner.Listener'。虽然'Context'对象没有实现'WifiScanner.Listener'接口,这并不能解决任何问题。为了让你的答案有效,他的活动应该实现监听器接口 – Pelocho

+0

@MD我不认为他* *将监听器附加到片段 –

相关问题