1

我的应用程序遇到了一些非常奇怪的问题。我有一个 EditText 元素,我们称之为显示,在每个选项卡的重用片段中。每次启动应用程序时,当我单击将文本发送到输出显示的按钮时,都会看到以下初始行为。我不使用系统键盘,只有我的按钮发送到显示器。

考虑这一点的最佳方式就像一个带有选项卡的 Web 浏览器,您可以在每个选项卡中单独编辑 URL,并且位于其他两个部分下方的按钮提供输入。它不是网络浏览器,但类比有效。

在此处输入图像描述

  • 不要点击任何东西 -> 在 B 选项卡中绘制的文本
  • 单击 B -> 在 C 选项卡中绘制的文本
  • 单击 C -> 在 C 选项卡中绘制的文本
  • 单击 B -> 单击 C -> 应用程序崩溃

我可能会遇到围栏错误,但我不确定。我可以在 A 的输出中绘制文本,但只有在单击或两次之后。

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

    midPager = (ViewPager) findViewById(R.id.function_container);
    topPager = (ViewPager) findViewById(R.id.top_container);
    midPagerAdapter = new midPageAdapter(getFragmentManager());
    midPager.setAdapter(midPagerAdapter);

    final ActionBar actionBar = getActionBar();
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
    actionBar.setDisplayOptions(0, ActionBar.DISPLAY_SHOW_TITLE);

    TabsAdapter topTabsAdapter = new TabsAdapter(this,topPager);
    topTabsAdapter.addTab(actionBar.newTab().setText("1"), 
                          TopFragment.class, null);
    topTabsAdapter.addTab(actionBar.newTab().setText("2"), 
                          TopFragment.class, null);
    topTabsAdapter.addTab(actionBar.newTab().setText("3"), 
                          TopFragment.class, null);

    if (savedInstanceState != null) {
        actionBar.setSelectedNavigationItem(savedInstanceState.getInt("tab",0));
    }
}

在我管理标签的功能中,这就是我所拥有的:

public static class TabsAdapter extends FragmentPagerAdapter
implements ActionBar.TabListener, ViewPager.OnPageChangeListener {
    private final Context mContext;
    private final ActionBar mActionBar;
    private final ViewPager mViewPager;
    private final ArrayList<TabInfo> mTabs = new ArrayList<TabInfo>();

    static final class TabInfo {
        private final Class<?> clss;
        private final Bundle args;

        TabInfo(Class<?> _class, Bundle _args) {
            clss = _class;
            args = _args;
        }
    }

    public TabsAdapter(Activity activity, ViewPager pager) {
        super(activity.getFragmentManager());
        mContext = activity;
        mActionBar = activity.getActionBar();
        mViewPager = pager;
        mViewPager.setAdapter(this);
        mViewPager.setOnPageChangeListener(this);
    }

    public void addTab(ActionBar.Tab tab, Class<?> clss, Bundle args) {
        TabInfo info = new TabInfo(clss, args);
        tab.setTag(info);
        tab.setTabListener(this);
        mTabs.add(info);
        mActionBar.addTab(tab);
        notifyDataSetChanged();
    }

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

    @Override
    public Fragment getItem(int position) {
        TabInfo info = mTabs.get(position);
        return Fragment.instantiate(mContext, info.clss.getName(), info.args);
    }

    @Override
    public void onPageScrolled(int position, float positionOffset,
                               int positionOffsetPixels) {
    }

    @Override
    public void onPageSelected(int position) {
        mActionBar.setSelectedNavigationItem(position);
    }

    @Override
    public void onTabSelected(Tab tab, FragmentTransaction ft) {
        Object tag = tab.getTag();

        for (int i = 0; i < mTabs.size(); i++)
        {
            if (mTabs.get(i) == tag)
            {
                setActiveMap(i);
                mViewPager.setCurrentItem(i);
            }
        }
    }
}

在我的可重用片段中,我的 OnCreate 函数有这个。

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.top_fragment, container, false);
    Foobar active = Container.getActiveMap();
    active.editLine = (EditText) v.findViewById(R.id.display);
    active.editLine.setCursorVisible(false);
    active.editLine.addTextChangedListener((TextWatcher) this);
    ((EditText) v.findViewById(R.id.display)).setOnClickListener(this);
    return v;
}

一个可以帮助我调试的问题是如何在选项卡的重用片段中调试 EditText?EditText 小部件使用哪些数据来区分不同的选项卡?我尝试了各种 .tostring() 的函数但没有成功。

更理想的解决方案是您在此代码中发现的一个简单错误。谢谢你的帮助。

我们可以有 3 个单独的片段,但它们都具有相同的配置,但这看起来不必要地难看。

4

0 回答 0