Java 安卓碎片问题

Java 安卓碎片问题,java,android,static,android-fragments,Java,Android,Static,Android Fragments,我是Android新手,(不是编程,甚至不是Java),所以请容忍我 我正在设法掌握碎片的使用 我有一个使用默认滑动/操作栏创建的项目。我进一步扩展了它以处理我想要的设置。。。。然而,我不太明白发生了什么/如何解决这个问题 /** * A {@link FragmentPagerAdapter} that returns a fragment corresponding to * one of the sections/tabs/pages. */ public class Section

我是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\u SECTION\u编号进行静态引用

这可能有一个简单的解决办法,我对Android和Java已经够不熟悉了,因为我目前的工作就是把所有的时间都花在SQL Server上

--编辑增刊 我不反对任何静态或最终的东西。我不太理解的问题是,我想在每个片段中做些什么。我在每个布局上都有一个文本视图,我希望能够在循环中操纵它们。我想我被困在一个圈子里,找不到出路。。。哈哈

例如,下面是我上面的代码

    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;
//追加(“计数:+intCount+”\n\n”)

我遇到了一个循环,如果我在onClick事件中尝试使用dummytext w/它会说我需要将其设置为静态(快速修复),并抱怨错误为:无法在不同方法中定义的inder类中引用非最终变量dummy7Text

我在onCreate中添加了一个变量来处理这个问题,该变量被填充为(LayoutInflater和Viewgroup),然后在onclick(未显示)中引用它们,但是当我进入并实例化时……文本视图没有发生任何变化


有一件事我还没有完全明白,一旦我通过了那道关卡,我就可以把它做成我想要的样子。

这意味着
ARG\u SECTION\u NUMBER
应该声明为
公共静态
。如果声明为
公共静态final
更好

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

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

我不明白下面这句话

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

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

错误是:无法对非静态字段DummySectionFragment.ARG\u SECTION\u编号进行静态引用

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

另一个选项(如果您确实不想要静态字段)是对字符串进行硬编码。因此,您的代码是:

args.putInt(“段号”,位置+1);
然而,公共静态字段是一种更好的编码实践,它可以防止字符串中的错误

我遇到一个循环,如果我在onClick事件中尝试使用dummytext w/,它会说我需要将其设置为静态(快速修复),并抱怨错误为:无法在不同方法中定义的inder类中引用非最终变量dummy7Text

我不使用匿名内部类,而是让您的片段实现
OnClickListener

例如:

公共类MyFragment扩展了片段实现OnClickListener{
@凌驾
CreateView上的公共视图(布局、充气机、视图组容器、捆绑包保存状态){
// ...
按钮btntRuncatedLocationStable=(按钮)rootView.findViewById(R.id.btntRuncatedLocationStable);
btntRuncatedLocationStable.setOnClickListener(此);
// ...
}
@凌驾
公共void onClick(视图v){
//您可以在这里引用dummyTextView,没有任何问题
}
}

好的,我开始对正在发生的事情有一点了解,请查看我的编辑和添加,以进一步澄清我想要做什么。我想我已经接近了。对于您关于
OnClickListener
的其他问题-在这种情况下,我建议让您的片段实现
OnClickListener
,而不是尝试使用匿名内部类。这样,您就不必担心将变量设置为静态或最终变量,以便内部类可以使用它们。例如,这会有很大帮助吗?我以前用Java编写过,但可能已经用了8年了……我正在挖掘我的方法,我花了更多的时间管理数据库(DBA)而不是编码,但该死的,我喜欢编码……我在每个片段上都有按钮,以实现我在另一个项目中实现的各种功能,我正试图通过一个新的接口复制功能(这就是我为什么要这样做的原因)。谢谢。尝试确保我理解正确。如果我添加了这一点,我应该能够访问我的文本视图w/在我的onclick事件中的按钮?我必须说,由于我收到了高质量的答案,我越来越喜欢这个网站。谢谢你的帮助!如果我的理解正确,那么我将把这标记为一个答案d应该超过15次,并标记你为u