所以我一直在尝试使用androidx.preference.PreferenceFragmentCompat创建一个设置活动,它一切正常.
但是由于某种原因,在偏好类别和偏好本身上都存在一些填充.我设法通过使用app:iconSpaceReserved ="false"来摆脱首选项的填充,但这似乎不适用于类别.
我已经尝试了所有各种主题,PreferenceThemeOverlay.v14.Material等但它们似乎没有什么区别
这是我的一切代码!
SettingsActivity.java
import android.os.Bundle;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
public class SettingsActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_settings);
Toolbar toolbar = findViewById(R.id.settings_toolbar);
setSupportActionBar(toolbar);
ActionBar actionBar = getSupportActionBar();
if (actionBar != null) {
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setDisplayShowTitleEnabled(false);
}
}
}
Run Code Online (Sandbox Code Playgroud)
activity_settings.xml
<androidx.constraintlayout.widget.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=".SettingsActivity">
<androidx.appcompat.widget.Toolbar
android:id="@+id/settings_toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
style="@style/ToolbarTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/title_settings"
android:textColor="@color/font_dark_primary" />
</androidx.appcompat.widget.Toolbar>
<fragment
android:name="com.henrytwist8gmail.fullcart.SettingsTestFragment"
android:tag="settings_fragment"
android:layout_width="match_parent"
android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toBottomOf="@id/settings_toolbar" />
</androidx.constraintlayout.widget.ConstraintLayout>
Run Code Online (Sandbox Code Playgroud)
SettingsTestFragment.java
import android.os.Bundle; …Run Code Online (Sandbox Code Playgroud) android android-appcompat android-preferences preferencefragment androidx
我有几个自定义DialogPreference实现,例如这个:
package apt.tutorial;
import android.content.Context;
import android.content.res.TypedArray;
import android.os.Bundle;
import android.os.Parcel;
import android.os.Parcelable;
import android.preference.DialogPreference;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewParent;
import android.widget.TimePicker;
public class TimePreference extends DialogPreference {
private int lastHour=0;
private int lastMinute=0;
private TimePicker picker=null;
public static int getHour(String time) {
String[] pieces=time.split(":");
return(Integer.parseInt(pieces[0]));
}
public static int getMinute(String time) {
String[] pieces=time.split(":");
return(Integer.parseInt(pieces[1]));
}
public TimePreference(Context ctxt) {
this(ctxt, null);
}
public TimePreference(Context ctxt, AttributeSet attrs) {
this(ctxt, attrs, 0); …Run Code Online (Sandbox Code Playgroud) FragmentManager已弃用.有替代方法或我现在可以做什么?
PlaceAutocompleteFragment autocompleteFragment = (PlaceAutocompleteFragment) getFragmentManager().findFragmentById(R.id.place_autocomplete_fragment);
autocompleteFragment.setOnPlaceSelectedListener(new PlaceSelectionListener() {
@Override
public void onPlaceSelected(Place place) {
// TODO: Get info about the selected place.
destination = place.getName().toString();
destinationLatLng = place.getLatLng();
}
@Override
public void onError(Status status) {
// TODO: Handle the error.
}
});
Run Code Online (Sandbox Code Playgroud)



如果您查看Android设置屏幕截图或FragmentsBC屏幕截图,PreferenceFragment中会有保证金.你怎么能摆脱它?
我尝试将PreferenceFragment宽度设置为fill_parent,但没有运气.
在我要求删除PreferenceActivity/PreferenceFragment的填充之前:
Android:如何最大化PreferenceFragment宽度(或摆脱保证金)?
这次我无法在标题文本之前调整边距/填充.(见下图).

有人有任何想法吗?
我正在创建一个具有一些设置的应用程序,我想使用内置的PreferenceActivity或PreferenceFragment来完成工作
一些偏好有一个很长的标题,我无法缩短,而且我认为如果我本地化应用程序(翻译成多种语言),我将面临同样的问题(例如在德语中,有时会有很长的单词).
你在这种情况下得到的只是文本的开头,然后是"......"(或更少的点,这对btw没有多大意义).
例:

我知道PreferenceActivity从ListActivity扩展,所以我可以将其适配器更改为我想要的任何东西,但这将删除它的工作方式.
我也知道我可以从每个类型的首选项类扩展,使用"onCreateView"方法来引用创建的视图,然后访问它的子类,但这很奇怪,不是吗?我的意思是,它几乎就像假设它永远不会改变它的外观.
编辑:这是我尝试过的示例代码:
从每个首选项类扩展,并在每个首选项中使用:
...
@Override
protected View onCreateView(final ViewGroup parent)
{
final View view=super.onCreateView(parent);
ViewUtil.handlePreferenceTitleTextView(view);
return view;
}
...
//ViewUtil.java :
private void handlePreferenceTitleTextView(final View v)
{
final TextView titleTextView=(TextView)v.findViewById(android.R.id.title);
if(titleTextView!=null)
titleTextView.setSingleLine(false);
}
Run Code Online (Sandbox Code Playgroud)
它有效,但我不认为这是推荐的,因为Google可能会改变首选项视图的工作方式.
如何在Android上的首选项标题中处理长文本?
是否有可能使它具有椭圆形/选框(以便它将有一个动画来显示所有内容)?或者也许自动适合字体大小?或者将其设置为自动换行?还是一个水平scrollView,允许用户滚动阅读文本的其余部分?
是否可能有如何处理此类案件的惯例?也许长按一下可以看到整个文本的吐司/对话框?
android textview longtext preferenceactivity android-preferences
由于不推荐使用PreferenceFragment,因此我使用PreferenceFragmentCompat.
缩进很可能是因为图标而出现,但我不使用它们(默认是没有图标).
我试图将图标属性设置为android:icon="@null"或android:color/transparent,但它没有帮助.
替换片段的功能:
private fun replaceFragment(fragment: Fragment) {
supportFragmentManager.beginTransaction()
.replace(R.id.fragment_layout, fragment)
.commit()
}
Run Code Online (Sandbox Code Playgroud)
content_main.xml
<LinearLayout 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"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:context=".MainActivity"
tools:showIn="@layout/app_bar_main">
<FrameLayout
android:id="@+id/fragment_layout"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)
我的设置片段:
class SettingsFragment : PreferenceFragmentCompat() {
companion object {
/**
* A preference value change listener that updates the preference's summary
* to reflect its new value.
*/
private val sBindPreferenceSummaryToValueListener = Preference.OnPreferenceChangeListener { preference, value ->
val stringValue = value.toString()
if (preference is ListPreference) …Run Code Online (Sandbox Code Playgroud) 在我的Android应用程序中,我定义了一个非常基本的PreferenceScreen:
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<ListPreference
android:entries="@array/test_entries"
android:entryValues="@array/test_values"
android:key="key_test1"
android:title="Test title 1" />
<CheckBoxPreference
android:key="key_test2"
android:summary="Test description 1"
android:title="Test title 2" />
</PreferenceScreen>
Run Code Online (Sandbox Code Playgroud)
并实现了相应的PreferenceFragmentCompat类:
class SettingsFragment : PreferenceFragmentCompat() {
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
setPreferencesFromResource(R.xml.settings, rootKey)
}
}
Run Code Online (Sandbox Code Playgroud)
我正在使用的依赖:
implementation "com.android.support:preference-v7:28.0.0"
Run Code Online (Sandbox Code Playgroud)
以及承载以下内容的布局代码Fragment:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
android:orientation="vertical"
tools:context=".ui.activity.MainActivity">
<android.support.v7.widget.Toolbar
android:id="@+id/mainToolbar"
android:layout_width="match_parent"
android:layout_height="?android:attr/actionBarSize" />
<fragment
android:id="@+id/navHostFragment"
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:defaultNavHost="true"
app:navGraph="@navigation/navigation" />
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)
一切都很好,除了每个偏好左侧有一个巨大的空白区域:
这个问题的原因是什么,我该如何预防呢?
编辑:
似乎问题是图标的空间被保留,即使我们没有使用偏好条目的图标. …
我已经迁移到 androidx.* 库,其中之一是新的首选项库:
androidx.preference:preference:1.1.0-alpha01- 它的最新版本。
如发行说明中 所述,iconSpaceReserved属性与 PreferenceCategories 无法正常工作已修复。
但看起来它默认设置为true。
我已经构建了演示项目来测试它。
首选项片段
import androidx.preference.PreferenceFragmentCompat;
public class SetttingsFragment extends PreferenceFragmentCompat {
@Override
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
addPreferencesFromResource(R.xml.preferences);
}
}
Run Code Online (Sandbox Code Playgroud)
首选项.xml
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<PreferenceCategory android:title="Category 1">
<Preference
android:key="pref1"
android:title="Preference 1" />
<Preference
android:key="pref2"
android:title="Preference 2" />
</PreferenceCategory>
<PreferenceCategory
android:title="Category 2"
app:iconSpaceReserved="false">
<Preference
android:key="pref3"
android:title="Preference 3" />
<Preference
android:key="pref4"
android:title="Preference 4"
app:iconSpaceReserved="false" />
</PreferenceCategory>
...
</PreferenceScreen>
Run Code Online (Sandbox Code Playgroud)
首选项主题根据需要设置。
样式文件
<item name="preferenceTheme">@style/PreferenceThemeOverlay</item>
Run Code Online (Sandbox Code Playgroud)
截屏
当app:iconSpaceReserved=false …
我的应用程序中有一个首选项屏幕,它偏离了中心,标题文本或数据不是从下图所示的左侧开始。我正在初始化设置片段。我没有应用任何视觉变化或添加任何特殊属性。
父活动中没有填充或边距。我还有一个回收器视图,它在应用程序中显示得非常好,但它偏离了中心
这是我的首选项.xml 文件
<androidx.preference.PreferenceScreen
xmlns:app="http://schemas.android.com/apk/res-auto">
<PreferenceCategory
app:title="General">
<Preference
app:key="feedback"
app:title="Send Feedback"
app:summary="Report technical issues or suggest new features"/>
<Preference
app:key="about"
app:title="About Us"/>
</PreferenceCategory>
<PreferenceCategory
app:title="Customize">
<SwitchPreferenceCompat
app:key="@string/key_darkTheme"
app:title="Enable Dark Theme"
app:summary="Enable dark theme throughout app (Restarts App Automatically)"
app:defaultValue="false"/>
<ListPreference
app:key="@string/key_font"
app:title="Set Font Size"
app:entries="@array/settings_list_preference_font"
app:entryValues="@array/settings_list_preference_values"
app:defaultValue="2"
app:summary="Set font size according to your liking"/>
</PreferenceCategory>
</androidx.preference.PreferenceScreen>
Run Code Online (Sandbox Code Playgroud)
android android-layout android-xml android-support-library androidx
android ×10
androidx ×3
preference ×2
android-xml ×1
java ×1
kotlin ×1
longtext ×1
margin ×1
textview ×1