片段和ViewPagers的首选项 - Android

时间:2013-04-08 16:56:51

标签: android android-fragments android-viewpager preferences

让自己彻底混淆了大量的SO标签打开看起来相关但不完全回答我的问题所以最后我承认失败并问我自己。

我想实现一个设置页面。我正在使用片段和ViewPager,因为我有两个主屏幕在相同的标题和Actionbar(编码和解码屏幕)下运行。这是我的代码片段(试图取出看起来无关紧要的部分)

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));
    }
}

}

activity_main.xml中

<android.support.v4.view.ViewPager xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/pager"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

PrefsFragment.java

package uk.ac.ox.bras2756.colourgrid;

import android.os.Bundle;
import android.preference.PreferenceFragment;
import android.util.Log;

public class PrefsFragment extends PreferenceFragment {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // Load the preferences from an XML resource
        addPreferencesFromResource(R.xml.preferences);
    }
}

SetPreferenceActivity.java

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%确定。

编辑: 全部排序。更新了上面的代码,以防它可以帮助其他任何人。

1 个答案:

答案 0 :(得分:3)

  

另外,我还没有onCreateOptionsMenu,我很困惑把它放在哪里以及放在里面的东西。

“三点按钮”与偏好没有任何关系。这就是操作栏溢出(如缺少MENU按钮的设备所示)。您需要编写一些代码,通常是XML资源,以便在操作栏溢出时显示某些内容,例如要链接到PreferenceActivity的项目。

例如,您可能有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>

您的活动可能会:

  @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));
  }

评论指出,您可以在startActivity()上使用PreferenceActivity致电PreferenceFragment

您可以在the documentation中详细了解操作栏,您可以在the documentation中详细了解PreferenceActivity