使用片段在可Swipable选项卡中加载首选项设置

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用片段在可Swipable选项卡中加载首选项设置相关的知识,希望对你有一定的参考价值。

我在网上搜索过但没找到任何合适的解决方案。

我正在尝试在Tab Fragments中加载一些首选项设置。

What I get Now.

My requirement

在第一张图片中,当我使用菜单充气器时,我得到那些3个虚线按钮,我不需要那些,我想让菜单加载到我的Tab片段中。

以下是我的代码

setting pref activity.Java

public class SettingsPrefActivity extends AppPreferenceActivity {
private static final String TAG = SettingsPrefActivity.class.getSimpleName();

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);

    // load settings fragment
    getFragmentManager().beginTransaction().replace(android.R.id.content, new MainPreferenceFragment()).commit();
}

public static class MainPreferenceFragment extends PreferenceFragment {
    @Override
    public void onCreate(final Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.pref_main);

        // gallery EditText change listener
        bindPreferenceSummaryToValue(findPreference(getString(R.string.key_gallery_name)));

        // notification preference change listener
        bindPreferenceSummaryToValue(findPreference(getString(R.string.key_notifications_new_message_ringtone)));

        // feedback preference click listener
        Preference myPref = findPreference(getString(R.string.key_send_feedback));
        myPref.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
            public boolean onPreferenceClick(Preference preference) {
                sendFeedback(getActivity());
                return true;
            }
        });
    }
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    if (item.getItemId() == android.R.id.home) {
        onBackPressed();
    }
    return super.onOptionsItemSelected(item);
}

private static void bindPreferenceSummaryToValue(Preference preference) {
    preference.setOnPreferenceChangeListener(sBindPreferenceSummaryToValueListener);

    sBindPreferenceSummaryToValueListener.onPreferenceChange(preference,
            PreferenceManager
                    .getDefaultSharedPreferences(preference.getContext())
                    .getString(preference.getKey(), ""));
}

/**
 * A preference value change listener that updates the preference's summary
 * to reflect its new value.
 */
private static Preference.OnPreferenceChangeListener sBindPreferenceSummaryToValueListener = new Preference.OnPreferenceChangeListener() {
    @Override
    public boolean onPreferenceChange(Preference preference, Object newValue) {
        String stringValue = newValue.toString();

        if (preference instanceof ListPreference) {
            // For list preferences, look up the correct display value in
            // the preference's 'entries' list.
            ListPreference listPreference = (ListPreference) preference;
            int index = listPreference.findIndexOfValue(stringValue);

            // Set the summary to reflect the new value.
            preference.setSummary(
                    index >= 0
                            ? listPreference.getEntries()[index]
                            : null);

        } else if (preference instanceof RingtonePreference) {
            // For ringtone preferences, look up the correct display value
            // using RingtoneManager.
            if (TextUtils.isEmpty(stringValue)) {
                // Empty values correspond to 'silent' (no ringtone).
                preference.setSummary(R.string.pref_ringtone_silent);

            } else {
                Ringtone ringtone = RingtoneManager.getRingtone(
                        preference.getContext(), Uri.parse(stringValue));

                if (ringtone == null) {
                    // Clear the summary if there was a lookup error.
                    preference.setSummary(R.string.summary_choose_ringtone);
                } else {
                    // Set the summary to reflect the new ringtone display
                    // name.
                    String name = ringtone.getTitle(preference.getContext());
                    preference.setSummary(name);
                }
            }

        } else if (preference instanceof EditTextPreference) {
            if (preference.getKey().equals("key_gallery_name")) {
                // update the changed gallery name to summary filed
                preference.setSummary(stringValue);
            }
        } else {
            preference.setSummary(stringValue);
        }
        return true;
    }
};

/**
 * Email client intent to send support mail
 * Appends the necessary device information to email body
 * useful when providing support
 */
public static void sendFeedback(Context context) {
    String body = null;
    try {
        body = context.getPackageManager().getPackageInfo(context.getPackageName(), 0).versionName;
        body = "

-----------------------------
Please don't remove this information
 Device OS: Android 
 Device OS version: " +
                Build.VERSION.RELEASE + "
 App Version: " + body + "
 Device Brand: " + Build.BRAND +
                "
 Device Model: " + Build.MODEL + "
 Device Manufacturer: " + Build.MANUFACTURER;
    } catch (PackageManager.NameNotFoundException e) {
    }
    Intent intent = new Intent(Intent.ACTION_SEND);
    intent.setType("message/rfc822");
    intent.putExtra(Intent.EXTRA_EMAIL, new String[]{"contact@androidhive.info"});
    intent.putExtra(Intent.EXTRA_SUBJECT, "Query from android app");
    intent.putExtra(Intent.EXTRA_TEXT, body);
    context.startActivity(Intent.createChooser(intent, context.getString(R.string.choose_email_client)));
}}

settings activity.Java

public class SettingsActivity extends  Fragment {
private static final String TAG = SettingsPrefActivity.class.getSimpleName();
/*public SettingsActivity() {
    // Required empty public constructor
}*/

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setHasOptionsMenu(true);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    return inflater.inflate(R.layout.setting_layout, container, false);
}


/*public boolean onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    inflater.inflate(R.menu.menu_main, menu);
    return true;
}
 @Override
 public boolean onOptionsItemSelected(MenuItem item) {
    int id = item.getItemId();

    if (id == R.id.action_settings) {
        // launch settings activity
        startActivity(new Intent(SettingsActivity.this, SettingsPrefActivity.class));
        return true;
    }

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

pref_main.xml

<?xml version="1.0" encoding="utf-8"?>

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceCategory android:title="General">
    <EditTextPreference
        android:defaultValue="@string/default_gallery_storage"
        android:key="@string/key_gallery_name"
        android:summary="@string/default_gallery_storage"
        android:title="@string/title_gallery_storage" />

    <CheckBoxPreference
        android:defaultValue="true"
        android:key="@string/key_upload_over_wifi"
        android:summary="@string/summary_upload_over_wifi"
        android:title="@string/title_auto_upload" />

    <ListPreference
        android:defaultValue="3"
        android:dialogTitle="@string/title_upload_quality"
        android:entries="@array/pref_upload_quality_entries"
        android:entryValues="@array/pref_upload_quality_values"
        android:key="@string/key_upload_quality"
        android:summary="@string/summary_upload_video_quality"
        android:title="@string/title_upload_quality" />

</PreferenceCategory>

<PreferenceCategory android:title="@string/pref_title_notifications">

    <SwitchPreference
        android:defaultValue="true"
        android:key="@string/notifications_new_message"
        android:title="@string/title_new_notification_sound" />

    <RingtonePreference
        android:defaultValue="content://settings/system/notification_sound"
        android:dependency="notifications_new_message"
        android:key="@string/key_notifications_new_message_ringtone"
        android:ringtoneType="notification"
        android:summary="@string/summary_choose_ringtone"
        android:title="@string/pref_title_ringtone" />

    <SwitchPreference
        android:defaultValue="true"
        android:key="@string/key_vibrate"
        android:summary="@string/summary_vibrate"
        android:title="@string/title_vibrate" />
</PreferenceCategory>

<PreferenceCategory android:title="@string/pref_header_about">

    <Preference
        android:selectable="false"
        android:summary="@string/summary_about" />

    <Preference
        android:summary="@string/app_version"
        android:title="@string/title_version" />

    <Preference
        android:key="@string/key_send_feedback"
        android:summary="@string/summary_support"
        android:title="@string/title_send_feedback" />

    <!-- preference opens url in browser -->
    <Preference
        android:summary="@string/summary_faq"
        android:title="@string/title_faq">
        <intent
            android:action="android.intent.action.VIEW"
            android:data="@string/url_faq" />
    </Preference>

    <Preference android:title="@string/privacy_policy">
        <intent
            android:action="android.intent.action.VIEW"
            android:data="@string/url_privacy" />
    </Preference>

    <Preference android:title="@string/title_terms">
        <intent
            android:action="android.intent.action.VIEW"
            android:data="@string/url_terms" />
    </Preference>
</PreferenceCategory>
</PreferenceScreen>

menu_main.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:context="settings.MainActivity">

<item
    android:id="@+id/action_settings"
    android:orderInCategory="100"
    android:title="@string/action_settings"
    app:showAsAction="never" />
 </menu>

settings_layout.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="This is Settings Page!! Coming Soon!"
    android:textSize="30dp"
    android:textStyle="bold"
    android:layout_centerInParent="true"/>
 </RelativeLayout> 

main activity.Java

public class MainActivity extends AppCompatActivity {

private Toolbar toolbar;
private TabLayout tabLayout;
private ViewPager viewPager;
private int[] tabIcons = {R.drawable.ic_action_name};
String[] tabTitle={"","All"};
int[] unreadCount={0,5,3,0,12,3,9,0};


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

    toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    getSupportActionBar().setDisplayHomeAsUpEnabled(true);

    viewPager = (ViewPager) findViewById(R.id.viewpager);
    setupViewPager(viewPager);

    tabLayout = (TabLayout) findViewById(R.id.tabs);
    tabLayout.setupWithViewPager(viewPager);

    viewPager.setCurrentItem(1);

    setupTabIcons();
}

private View prepareTabView(int pos) {
    View view = getLayoutInflater().inflate(R.layout.custom_tab,null);
    TextView tv_title = (TextView) view.findViewById(R.id.tv_title);
    TextView tv_count = (TextView) view.findViewById(R.id.tv_count);
    tv_title.setText(tabTitle[pos]);
    if(unreadCount[pos]>0)
    {
        tv_count.setVisibility(View.VISIBLE);
        tv_count.setText(""+unreadCount[pos]);
    }
    else
        tv_count.setVisibility(View.GONE);

    return view;
}

private void setupTabIcons() {
    tabLayout.getTabAt(0).setIcon(tabIcons[0]);

        /*TabLayout.Tab tabitem = tabLayout.newTab();
        tabitem.setCustomView(prepareTabView(i));
        tabLayout.addTab(tabitem);*/

    for(int i = 1; i < unreadCount.length; i++)
    {
        /*TabLayout.Tab tabitem = tabLayout.newTab();
        tabitem.setCustomView(prepareTabView(i));
        tabLayout.addTab(tabitem);*/

        tabLayout.getTabAt(i).setCustomView(prepareTabView(i));
    }
    }

private TabLayout.OnTabSelectedListener onTabSelectedListener(final 
ViewPager viewPager) {

    return new TabLayout.OnTabSelectedListener() {
        @Override
        public void onTabSelected(TabLayout.Tab tab) {
            viewPager.setCurrentItem(tab.getPosition());
        }

        @Override
        public void onTabUnselected(TabLayout.Tab tab) {

        }

        @Override
        public void onTabReselected(TabLayout.Tab tab) {

        }
    };
}

private void setupViewPager(ViewPager viewPager) {
    ViewPagerAdapter adapter = new 
ViewPagerAdapter(getSupportFragmentManager());
    adapter.addFragment(new SettingsActivity(), "");
    adapter.addFragment(new AllTab(), "All");

    viewPager.setAdapter(adapter);
}

class ViewPagerAdapter extends FragmentPagerAdapter {
    private final List<Fragment> mFragmentList = new ArrayList<>();
    private final List<String> mFragmentTitleList = new ArrayList<>();

    public ViewPagerAdapter(FragmentManager manager) {
        super(manager);
    }

    @Override
    public Fragment getItem(int position) {
        return mFragmentList.get(position);
    }

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

    public void addFragment(Fragment fragment, String title) {
        mFragmentList.add(fragment);
        mFragmentTitleList.add(title);
    }

    @Override
    public CharSequence getPageTitle(int position) {
        return mFragmentTitleList.get(position);
    }
}
}

activity_main.xml中

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="inc.apperz.passmanager.MainActivity">


<android.support.design.widget.AppBarLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="?attr/colorPrimary"
        app:layout_scrollFlags="scroll|enterAlways"
        app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />

    <android.support.design.widget.TabLayout
        android:id="@+id/tabs"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:tabMode="scrollable"
        app:tabSelectedTextColor="@color/colorGreen"
        app:tabTextColor="@color/colorWhite"
        app:tabIndicatorColor="@color/colorWhite"
        app:tabGravity="fill"/>


</android.support.design.widget.AppBarLayout>

<android.support.v4.view.ViewPager
    android:id="@+id/viewpager"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior" />

</android.support.constraint.ConstraintLayout>

我是否有可能将main_menu.xml包含到我的setting_layout.xml中?这样它会绑定到我的SettingsActivity.java?如果它可能,那将是伟大的,但我尝试了这种方式,并没有找到适当的方式来包括它。

有人可以指导我如何实现这一目标..

答案

尝试将此添加到您的片段:

@Override
public boolean onPrepareOptionsMenu(Menu menu) {
    MenuItem item= menu.findItem(R.id.action_settings);
    item.setVisible(false);
    super.onPrepareOptionsMenu(menu);
    return true;
}

以上是关于使用片段在可Swipable选项卡中加载首选项设置的主要内容,如果未能解决你的问题,请参考以下文章

在具有多行标题的选项卡上设置片段

在可排序选项卡中将文本框的值更改为其当前顺序

Android ActionBar 选项卡设置最初选择的选项卡

切换到片段选项卡主机中的选项卡时查看寻呼机丢失其内容

listview 没有在带有 viewpager 选项卡的片段中刷新

片段处理屏幕方向与操作栏中的选项卡