片段和浏览页面的首选项-Android

片段和浏览页面的首选项-Android,android,android-fragments,android-viewpager,preferences,Android,Android Fragments,Android Viewpager,Preferences,让我自己彻底被一大堆看起来相关的标签弄糊涂了,但没有完全回答我的问题,所以最后我承认失败并问我自己的问题 我想实现一个设置页面。我使用的是片段和一个ViewPager,因为我有两个主屏幕在同一个标题和操作栏下运行(编码和解码屏幕)。下面是我的代码片段(试图去掉看似无关的部分) MainActivity.java package uk.ac.ox.bras2756.colourgrid; import android.app.ActionBar; ...etc public class Mai

让我自己彻底被一大堆看起来相关的标签弄糊涂了,但没有完全回答我的问题,所以最后我承认失败并问我自己的问题

我想实现一个设置页面。我使用的是片段和一个ViewPager,因为我有两个主屏幕在同一个标题和操作栏下运行(编码和解码屏幕)。下面是我的代码片段(试图去掉看似无关的部分)

MainActivity.java

package uk.ac.ox.bras2756.colourgrid;

import android.app.ActionBar; ...etc

public class MainActivity extends FragmentActivity implements ActionBar.TabListener {

    AppSectionsPagerAdapter mAppSectionsPagerAdapter;
    ViewPager mViewPager; ...etc

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mAppSectionsPagerAdapter = new AppSectionsPagerAdapter(getSupportFragmentManager());

        final ActionBar actionBar = getActionBar();
        actionBar.setHomeButtonEnabled(false);
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

        mViewPager = (ViewPager) findViewById(R.id.pager);
        mViewPager.setAdapter(mAppSectionsPagerAdapter);
        mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
            @Override
            public void onPageSelected(int position) {
                actionBar.setSelectedNavigationItem(position);
            }
        });

        for (int i = 0; i < mAppSectionsPagerAdapter.getCount(); i++) {
            actionBar.addTab(
                    actionBar.newTab()
                            .setText(mAppSectionsPagerAdapter.getPageTitle(i))
                            .setTabListener(this));
        }
    }

    @Override
    public void onTabUnselected / Selected / Reselected ...etc

    public static class AppSectionsPagerAdapter extends FragmentPagerAdapter {

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

        @Override
        public Fragment getItem(int i) {
            switch (i) {
                case 0:...etc
            }
        }

    public static class LaunchpadSectionFragmentEncode extends Fragment {

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
            View rootView = inflater.inflate(R.layout.fragment_section_encode, container, false);
            ...return rootView;
        }
    }

    public static class LaunchpadSectionFragmentDecode extends Fragment {

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
            View rootView = inflater.inflate(R.layout.fragment_section_decode, container, false);
            ...return rootView;
        }
    }

        @Override
public boolean onCreateOptionsMenu(Menu menu) {
    new MenuInflater(this).inflate(R.menu.activity_main, menu);

    return(super.onCreateOptionsMenu(menu));
}

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
      switch (item.getItemId()) {
        case R.id.menu_settings:
        Intent intent = new Intent(this, SetPreferenceActivity.class);
        startActivity(intent);
          return(true);
      }

      return(super.onOptionsItemSelected(item));
    }
}

}
package uk.ac.ox.bras2756.colourgrid;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;

public class SetPreferenceActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        Log.i("SetPrefs", "Got there");

        getFragmentManager().beginTransaction().replace(android.R.id.content, new PrefsFragment()).commit();
    }

}
SetPreferenceActivity.java

package uk.ac.ox.bras2756.colourgrid;

import android.app.ActionBar; ...etc

public class MainActivity extends FragmentActivity implements ActionBar.TabListener {

    AppSectionsPagerAdapter mAppSectionsPagerAdapter;
    ViewPager mViewPager; ...etc

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mAppSectionsPagerAdapter = new AppSectionsPagerAdapter(getSupportFragmentManager());

        final ActionBar actionBar = getActionBar();
        actionBar.setHomeButtonEnabled(false);
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

        mViewPager = (ViewPager) findViewById(R.id.pager);
        mViewPager.setAdapter(mAppSectionsPagerAdapter);
        mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
            @Override
            public void onPageSelected(int position) {
                actionBar.setSelectedNavigationItem(position);
            }
        });

        for (int i = 0; i < mAppSectionsPagerAdapter.getCount(); i++) {
            actionBar.addTab(
                    actionBar.newTab()
                            .setText(mAppSectionsPagerAdapter.getPageTitle(i))
                            .setTabListener(this));
        }
    }

    @Override
    public void onTabUnselected / Selected / Reselected ...etc

    public static class AppSectionsPagerAdapter extends FragmentPagerAdapter {

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

        @Override
        public Fragment getItem(int i) {
            switch (i) {
                case 0:...etc
            }
        }

    public static class LaunchpadSectionFragmentEncode extends Fragment {

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
            View rootView = inflater.inflate(R.layout.fragment_section_encode, container, false);
            ...return rootView;
        }
    }

    public static class LaunchpadSectionFragmentDecode extends Fragment {

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
            View rootView = inflater.inflate(R.layout.fragment_section_decode, container, false);
            ...return rootView;
        }
    }

        @Override
public boolean onCreateOptionsMenu(Menu menu) {
    new MenuInflater(this).inflate(R.menu.activity_main, menu);

    return(super.onCreateOptionsMenu(menu));
}

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
      switch (item.getItemId()) {
        case R.id.menu_settings:
        Intent intent = new Intent(this, SetPreferenceActivity.class);
        startActivity(intent);
          return(true);
      }

      return(super.onOptionsItemSelected(item));
    }
}

}
package uk.ac.ox.bras2756.colourgrid;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;

public class SetPreferenceActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        Log.i("SetPrefs", "Got there");

        getFragmentManager().beginTransaction().replace(android.R.id.content, new PrefsFragment()).commit();
    }

}
res\xml\preferences.xml

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >

    <CheckBoxPreference
            android:key="prefkey_error"
            android:summary="@string/pref_sum_error"
            android:title="@string/pref_title_error"
            android:defaultValue="true" />
    <PreferenceCategory 
        android:title="@string/pref_decode"
        android:key="prefkey_decode">
        <ListPreference
            android:key="prefkey_matrix"
            android:title="@string/pref_title_matrix"
            android:summary="@string/pref_sum_matrix"
            android:entries="@array/matrixArray"
            android:entryValues="@array/matrixArrayValues" />
        <ListPreference
            android:key="prefkey_rotate"
            android:title="@string/pref_title_rotate"
            android:summary="@string/pref_sum_rotate"
            android:entries="@array/rotateArray"
            android:entryValues="@array/rotateArrayValues" />
        <CheckBoxPreference
            android:key="prefkey_weight"
            android:summary="@string/pref_sum_weight"
            android:title="@string/pref_title_weight"
            android:defaultValue="true" />
        <ListPreference
            android:key="prefkey_colour"
            android:title="@string/pref_title_colour"
            android:entries="@array/colourArray"
            android:entryValues="@array/colourArrayValues" />
    </PreferenceCategory>
    <PreferenceCategory 
        android:title="@string/pref_camera"
        android:key="prefkey_camera">
            <CheckBoxPreference
                android:key="prefkey_hotspots"
                android:title="@string/pref_title_hotspots"
                android:defaultValue="true" />
     </PreferenceCategory>
</PreferenceScreen>

我的应用程序加载正常,但当然是因为缺少一些东西,所以“选项”按钮没有显示出来。我错过了什么?我会在这里不断检查,直到我可以解决这个问题-在一个紧张的时间表

此外,由于某些原因,我的首选项文件旁边总是有*表示未保存,并且当我在手机上运行应用程序时,它总是要求我先保存,尽管手动保存。不知道那里发生了什么事

如果您需要查看更多的代码,请告诉我,并尝试提供所需的内容,但我不是100%确定

编辑: 都分类好了。更新了上面的代码,以防它能帮助其他人

另外,我还没有OnCreateOptions菜单,我不知道该放在哪里,该放什么

“三点按钮”与偏好完全无关。这就是操作栏溢出(在缺少菜单按钮的设备上可以看到)。您需要编写一些代码,通常是一个XML资源,以获得出现在操作栏溢出中的内容,例如指向您的
首选项活动的“要去的项目”链接

例如,您可能有一个
res/menu/actions.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/settings" android:icon="@android:drawable/ic_menu_preferences" android:title="@string/settings" android:showAsAction="never"></item>
</menu>
在注释指示的地方,您可以调用
首选项活动的
startActivity()
,该活动将使用您的
首选项片段


您可以在中阅读更多关于操作栏的信息,也可以在中阅读更多关于
首选项活动的信息。

“我想在操作栏上添加三点首选项按钮,现在每个人都有这些按钮”--如果您指的是操作栏溢出,“三点按钮”将仅适用于缺少专用菜单按钮的设备:另外,如果这确实是您所指的,请在您配置操作栏的地方发布代码(例如,
onCreateOptions菜单()
)。也许我找三个点是错误的,我只是希望我的首选项页面可以在某个地方单击,这样我就可以让用户选择应用程序使用的选项,我可以使用菜单按钮。另外,我还没有OnCreateOptions菜单,我不知道该放在哪里,该放什么。谢谢你的输入。我会研究一下你的建议,然后回来。我正在调用
newsetpreferenceactivity()这里你说“launch PreferenceActivity here”,但是在SetPreferenceActivity类中添加了一个日志之后,我可以看到我们在代码中从来没有做到这一点。我做错了什么?@David:你不能通过构造函数启动活动。你可以通过
startActivity()
开始新的活动:谁是numpty?我是!我想我需要睡一觉——谢谢你留下来指出显而易见的问题。我的设置屏幕现在,非常感谢@大卫:“谁是裸体?”(在谷歌上快速搜索“裸体”的定义)嗯,我,比我喜欢的更多。很高兴它现在对你有用。
  @Override
  public boolean onCreateOptionsMenu(Menu menu) {
    new MenuInflater(this).inflate(R.menu.actions, menu);

    return(super.onCreateOptionsMenu(menu));
  }

  @Override
  public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
      case R.id.settings:
        // launch your PreferenceActivity here

        return(true);
    }

    return(super.onOptionsItemSelected(item));
  }