我是Android(不是编程,甚至不是Java)的新手,所以请多多包涵。

我正在尝试处理碎片的使用。

我有一个使用默认的滑动/动作栏创建的项目。我进一步扩展了此功能,以处理所需的设置...。但是我不太了解正在发生的事情/如何解决此问题。

/**
 * A {@link FragmentPagerAdapter} that returns a fragment corresponding to
 * one of the sections/tabs/pages.
 */
public class SectionsPagerAdapter extends FragmentPagerAdapter {

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

    @Override
    public Fragment getItem(int position) {
        // getItem is called to instantiate the fragment for the given page.
        // Return a DummySectionFragment (defined as a static inner class
        // below) with the page number as its lone argument.
        Fragment fragment = new DummySectionFragment();
        Bundle args = new Bundle();
        args.putInt(DummySectionFragment.ARG_SECTION_NUMBER, position + 1);
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public int getCount() {
        // Show 8 total pages.
        return 8;
    }

    @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);
        case 3:
            return getString(R.string.title_section4).toUpperCase(l);
        case 4:
            return getString(R.string.title_section5).toUpperCase(l);
        case 5:
            return getString(R.string.title_section6).toUpperCase(l);
        case 6:
            return getString(R.string.title_section7).toUpperCase(l);
        case 7:
            return getString(R.string.title_section8).toUpperCase(l);
        }
        return null;
    }
}

/**
 * A dummy fragment representing a section of the app, but that simply
 * displays dummy text.
 */
public class DummySectionFragment extends Fragment {
    /**
     * The fragment argument representing the section number for this
     * fragment.
     */
    public String ARG_SECTION_NUMBER = "section_number";

    public DummySectionFragment() {
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        int position;

        position = getArguments().getInt(ARG_SECTION_NUMBER)-1;
        View rootView;
        TextView dummyTextView;


我真的不想要任何静态的或最终的东西,而且我基本上已经解决了这个问题,但是我不理解以下内容或如何解决。我有点明白它在做什么。

args.putInt(DummySectionFragment.ARG_SECTION_NUMBER, position + 1);


错误是:无法静态引用非静态字段DummySectionFragment.ARG_SECTION_NUMBER

可能有一个简单的解决方法,我对Android和Java并不熟悉,因为我目前的工作是将所有时间都花在SQL Server上。

-编辑添加
我不反对任何静态的或最终的东西。我不太了解的问题是我想在每个片段中做什么。我在每个布局上都有一个textview,我希望能够循环操纵它们。我想我陷入了困境,无法弄清楚我的出路...大声笑。

例如下面我放在上面的代码是

    case 4:
            rootView = inflater.inflate(R.layout.fragment_main_location,container, false);
            dummyTextView= (TextView) rootView .findViewById(R.id.section_label);

            // location
            Button btnShowLocation = (Button) rootView.findViewById(R.id.btnShowLocation);
            Button btnShowDBLocList = (Button) rootView.findViewById(R.id.btnShowDBLocList);
            Button btnLocationsCount = (Button) rootView.findViewById(R.id.btnLocationsCount);
            Button btnTruncateDBLocationsTable = (Button) rootView.findViewById(R.id.btnTruncateDBLocationsTable);

            btnTruncateDBLocationsTable.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    Activity activity = getActivity();
                    int intCount = 0;

                    /*if (activity != null) {
                        //dummyTextView.setText("");
                     try {
                         locationDatabaseHandler.truncateLocationTable();
                         intCount = locationDatabaseHandler.getLocationCount();
                     } catch (Exception e){
                         //dummyTextView.append(e.toString());
                     }
                     //dummyTextView.append("Count:" + intCount + "\n\n");
                     Toast.makeText(activity, "toast_you_just_clicked_a_fragment btnTruncateDBLocationsTable button", Toast.LENGTH_LONG).show();
                    }*/
                }
            });

            dummyTextView = (TextView) rootView    .findViewById(R.id.section_label);
            dummyTextView.append("\nLocation Stuff\n");
            break;


//dummyTextView.append("Count:“ + intCount +” \ n \ n“);

我碰到一个圈,如果我用dummyTextView尝试在onClick事件中使用dummmyText,它说我需要使其静态(快速修复),并出现以下错误消息:无法引用内部的非最终变量dummy7Text在不同方法中定义的inder类。

我在onCreate内添加了一个变量来处理该变量,将其填充为(LayoutInflater和Viewgroup,然后在onclick中引用它们(未显示),但是当我进入并实例化时... textviews没有任何反应...

有些事情我还不太会到这里,一旦我克服了这个障碍,我将一事无成,并且能够使其按我的意愿去做。

最佳答案

我真的不想要任何静态或最终的东西


为什么?它们不会对性能产生负面影响,也不是不良编码实践的迹象。


我不明白以下内容


可以使用包含任意数量的键-值对的捆绑包来创建每个片段。 DummySectionFragment.ARG_SECTION_NUMBER是键(字符串),而position + 1是值。因此,此代码告诉新的DummySectionFragment片段应显示的内容部分。

此方法比将这些参数放入构造函数更可取,因为不能保证为Fragment调用自定义构造函数。 Android有多种生成片段的方法,因此这降低了发生诸如NullPointerExceptions之类的问题的可能性。


错误是:无法静态引用非静态字段DummySectionFragment.ARG_SECTION_NUMBER


如您所知,DummySectionFragment.ARG_SECTION_NUMBER指的是DummySectionFragment类中称为ARG_SECTION_NUMBER的静态字段。通过使该字段为非静态,您将无法在没有DummySectionFragment实例的情况下引用该常量值。

另一个选择(如果您确实不希望使用静态字段)是对字符串进行硬编码。因此,您的代码将是:

args.putInt("section_number", position + 1);


但是,公共静态字段是更好的编码实践,可以防止在字符串中输入错误而产生愚蠢的错误。


我碰到一个循环,如果我的dummyTextView尝试在onClick事件中使用dummmyText,它说我需要使其静态(快速修复),并出现以下错误消息:无法引用内部的非最终变量dummy7Text在不同方法中定义的inder类。


与其使用匿名内部类,不如让我的Fragment实现OnClickListener

例如:

public class MyFragment extends Fragment implements OnClickListener {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        // ...

         Button btnTruncateDBLocationsTable = (Button) rootView.findViewById(R.id.btnTruncateDBLocationsTable);
         btnTruncateDBLocationsTable.setOnClickListener(this);

        // ...
    }

    @Override
    public void onClick(View v) {
        // You can reference dummyTextView here without any problems
    }
}

10-07 22:41