错误@Override片段中的方法被调用(Android)
问题描述:
我有一个使用片段的问题。
首先是一些基本的信息。我正在使用带3个Tabs/Fragments的Actionbar
(support.v4)。前两个片段会导致问题。第一个片段扩展了ListFragment,第二个扩展了片段。两者都有一个ListView
和一个ArrayAdapter
(不同的ArrayAdapters)。错误@Override片段中的方法被调用(Android)
-
我的片段:
在两个片段我创建了一个
ContextMenu
(不同的菜单/的菜单项):在两个片段我重写
onCreateContextMenu(..)
和onContextItemSelected(..)
。 -
我的适配器:
两个适配器重写getView方法。
如果我选择片段2的
ContextItem
,frament 1的onContextItemSelected
方法被称为:我的问题。
如果我更新片段2,也调用片段1的getView。
有了您的帮助和StackOverflow的我已经发现,如果一个片段是活跃的两个片段直接在它旁边是已经激活。因此,如果两个片段具有相同的可覆盖方法,则将选择第一个片段。 问题是,我没有找到解决方案;-)
有人在这里,谁了解我的问题和/或曾经处理过吗?
编辑:源代码
public class ActionBarActivity extends FragmentActivity implements
ActionBar.TabListener {
SectionsPagerAdapter mSectionsPagerAdapter;
ViewPager mViewPager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().requestFeature(Window.FEATURE_ACTION_BAR);
setContentView(R.layout.actionbarlayout);
mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());
mViewPager = (ViewPager) findViewById(R.id.pager);
mViewPager.setAdapter(mSectionsPagerAdapter);
android.support.v4.app.FragmentManager fm = getSupportFragmentManager();
android.support.v4.app.FragmentTransaction ft = fm.beginTransaction();
android.support.v4.app.Fragment myFirstFragment = (Fragment) new Fragment_ONE();
android.support.v4.app.Fragment mySecondFragment = (Fragment) new Fragment_TWO();
android.support.v4.app.Fragment myThirdFragment = (Fragment) new Fragment_THREE();
ft.add(R.id.pager, myFirstFragment, "FIRSTFRAGTAG");
ft.add(R.id.pager, mySecondFragment, "SECONDFRAGTAG");
ft.add(R.id.pager, myThirdFragment, "THIRDFRAGTAG");
ft.commit();
fm.executePendingTransactions();
public class SectionsPagerAdapter extends FragmentPagerAdapter {
public SectionsPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
switch (position){
case 0:
Fragment myFirstFragment = new Fragment_ONE();
return myFirstFragment;
case 1:
Fragment mySecondFragment = new Fragment_TWO();
return mySecondFragment;
case 2:
Fragment myThirdFragment = new Fragment_THREE();
return myThirdFragment;
default:
Fragment defaultFragment = new Fragment_ONE();
return defaultFragment;
}
}
@Override
public int getCount() {
// Show 3 total pages.
return 3;
}
@Override
public CharSequence getPageTitle(int position) {
Locale l = Locale.getDefault();
switch (position) {
case 0:
return getString(R.string.title_section1).toUpperCase(l);
case 1:
return getString(R.string.title_section2).toUpperCase(l);
case 2:
return getString(R.string.title_section3).toUpperCase(l);
}
return null;
}
@Override
public void onTabSelected(ActionBar.Tab tab,
FragmentTransaction fragmentTransaction) {
mViewPager.setCurrentItem(tab.getPosition());
}
@Override
public void onTabUnselected(ActionBar.Tab tab,
FragmentTransaction fragmentTransaction) {
}
@Override
public void onTabReselected(ActionBar.Tab tab,
FragmentTransaction fragmentTransaction) {
}
}
public class FirstAdapter extends ArrayAdapter<xxx> {
public BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
//SOME CODE
}
};
public FirstAdapter(Context context, ArrayList<xxx> items) {
super(context, 0, items);
// SOME CODE
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// SOME CODE: codeONE
return convertView;
}
}
public class SecondAdapter extends ArrayAdapter<xxx> {
public BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
//SOME CODE
}
};
public SecondAdapter(Context context, ArrayList<xxx> items) {
super(context, 0, items);
// SOME CODE
}
public class Fragment_ONE extends ListFragment{
public Fragment_ONE() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(
R.layout.firstfragment, container, false);
setRetainInstance(true);
return rootView;
}
@Override
public void onActivityCreated (Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
mFirstListView =(ListView) getView().findViewById(android.R.id.list);
registerForContextMenu(mFirstListView);
mFirstAdapter = new FirstAdapter(myInstance, mItemsONE);
mFirstListView.setAdapter(mFirstAdapter);
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
if (v.getId() == android.R.id.list) {
AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuInfo;
menu.setHeaderTitle("CONTEXTMENU");
menu.add(FIRST_FRAGMENT_GROUP_ID, 0, 0, "1");
menu.add(FIRST_FRAGMENT_GROUP_ID, 1, 1, "2");
menu.add(FIRST_FRAGMENT_GROUP_ID, 2, 2, "3");
menu.add(FIRST_FRAGMENT_GROUP_ID, 3, 3, "4");
menu.add(FIRST_FRAGMENT_GROUP_ID, 4, 4, "5");
menu.add(FIRST_FRAGMENT_GROUP_ID, 5, 5, "6");
}
}
@Override
public boolean onContextItemSelected(MenuItem item) {
if (item.getGroupId()==FIRST_FRAGMENT_GROUP_ID){
AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item
.getMenuInfo();
int ListItemIndex = info.position;
Intent broadcast = new Intent(UPDATEREQUEST);
broadcast.putExtra(UPDATEREQUESTEXTRA, 1);
ActionBarActivity.getMyInstance().getApplicationContext().sendBroadcast(broadcast);
return true;
}
}
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
}
}
public class Fragment_TWO extends Fragment {
public Fragment_TWO() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(
R.layout.secondfragment, container, false);
setRetainInstance(true);
return rootView;
}
@Override
public void onActivityCreated (Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
mySecondListView = (ListView) getView().findViewById(R.id.secondListView);
mySecondAdapter = new SecondAdapter(myInstance, myItemsTWO);
mySecondListView.setAdapter(mySecondAdapter);
registerForContextMenu(mySecondListView);
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuInfo;
menu.setHeaderTitle("Options");
menu.add(SECOND_FRAGMENT_GROUP_ID, 1, 1, "1");
menu.add(SECOND_FRAGMENT_GROUP_ID, 2, 2, "2");
}
@Override
public boolean onContextItemSelected(MenuItem item) {
super.onContextItemSelected(item);
// SOME CODE
Intent broadcast = new Intent(UPDATEREQUEST);
broadcast.putExtra(UPDATEREQUESTEXTRA, 1);
ActionBarActivity.getMyInstance().getApplicationContext().sendBroadcast(broadcast);
return true;
}
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// SOME CODE: codeTWO
return convertView;
}
}
答
的Android FragmentManager通过所有碎片迭代处理针对的ContextMenuItem选择覆盖,让您的每一个片段处理上下文菜单中点击需要有逻辑,是否处理呼叫或者如果该呼叫应该传递给下一个片段。
看到这个答案: Wrong fragment in ViewPager receives onContextItemSelected call
发布一些代码,您提出,我们会尽力帮助你们。但现在,这很困难。 – Fllo
你使用viewpager来保存片段? –
是的,我喜欢。因为圣诞节我没有那么多时间。但我会尽快写一些代码。非常感谢! – Wicked161089