2015-12-31 2 views
1

Я попытался создать индивидуальную схему предпочтений, потому что я хотел сделать с ней подборщик цветов.Как добраться до элементов макета, используя PreferenceFragment?

Я использовал решение here:

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

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

Я хотел, чтобы изменить значение TextView на макете, поэтому я добавил строки с TextView в нем.

Проблема в том, что она выбрала исключение NullPointerException в строке setText, потому что я считаю, что метод findViewById() возвращает null.

PrefFragment.java:

public class PrefFragment extends PreferenceFragment { 

    private TextView titleTV; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     addPreferencesFromResource(R.xml.preferences); 
    } 

    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     titleTV = (TextView) getActivity().findViewById(R.id.title); 
     titleTV.setText(R.string.pref_bgcolor); 
    } 
} 

preferences.xml:

<?xml version="1.0" encoding="utf-8"?> 
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> 
<Preference 
    android:title="@string/pref_bgcolor" 
    android:summary="@string/pref_bgcolor_sum" 
    android:key="hu.atsoft.myip.color" 
    android:widgetLayout="@layout/color_pref"/> 
</PreferenceScreen> 

color_pref.xml:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:id="@+id/color_preference"> 

    <TextView 
     android:id="@+id/title" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentTop="true" 
     android:layout_alignParentLeft="true" 
     android:paddingLeft="5dip" 
     android:paddingRight="5dip" 
     android:paddingTop="5dip" 
     android:singleLine="true" 
     android:textAppearance="?android:attr/textAppearanceMedium" 
     android:textColor="@android:color/black"/> 

    <TextView 
     android:id="@+id/summary" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:padding="5dip" 
     android:layout_alignParentLeft="true" 
     android:layout_below="@id/title" 
     android:singleLine="true" 
     android:textAppearance="?android:attr/textAppearanceSmall"/> 

    <ImageView 
     android:id="@+id/color_preview" 
     android:layout_width="20dip" 
     android:layout_height="20dip" 
     android:background="@android:color/darker_gray" 
     android:layout_alignParentRight="true" 
     android:layout_centerVertical="true" 
     android:layout_margin="5dip"/> 

</RelativeLayout> 

То, что я должен использовать, чтобы достичь элементов вместо этого findViewById () метод?

+0

Где вы получаете PrefFragment? –

+0

Переместить findviewbyId в onActivityCreated в PrefFragment. –

+0

Он по-прежнему выбрасывает одно и то же исключение NullPointerException в строке setText(). –

ответ

1

Вы должны использовать пользовательские Предпочтение:

PreferenceWithTip.class

public class PreferenceWithTip extends Preference { 
    private static final String TAG = "PreferenceWithTip"; 
    String pTitle = null; 
    String tipstring = null; 

    @SuppressLint("Recycle") 
    public PreferenceWithTip(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 

     Log.i(TAG,"PreferenceWithTip invoked"); 
     TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.PreferenceWithTip); 
     tipstring = ta.getString(R.styleable.PreferenceWithTip_tipstring); 
     pTitle = ta.getString(R.styleable.PreferenceWithTip_titlestring); 
     ta.recycle(); 
    } 

    public PreferenceWithTip(Context context, AttributeSet attrs) { 
     this(context, attrs, 0); 
    } 

    @Override 
    protected void onBindView(View view) { 
     super.onBindView(view); 
     TextView pTitleView = (TextView)view.findViewById(R.id.title); 
     pTitleView.setText(pTitle); 
     TextView pTipView = (TextView)view.findViewById(R.id.summary); 
     pTipView.setText(tipstring); 
    } 

    @Override 
    protected View onCreateView(ViewGroup parent) { 
     return LayoutInflater.from(getContext()).inflate(R.layout.color_pref, 
       parent, false); 
    } 


} 

attr.xml

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <declare-styleable name="PreferenceWithTip"> 
     <attr name="tipstring" format="string"></attr> 
     <attr name="titlestring" format="string"></attr> 
    </declare-styleable> 
</resources> 

preferences.xml:

<?xml version="1.0" encoding="utf-8"?> 
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> 
<com.test.mytest.PreferenceWithTip 
      preference:tipstring="a" 
      preference:titlestring="title" > 
     </com.test.mytest.PreferenceWithTip> 
</PreferenceScreen> 
Смежные вопросы