【问题标题】:Android set color安卓设置颜色
【发布时间】:2016-04-03 23:18:55
【问题描述】:

如何将背景颜色从对话框(SettingsFColorDialod)设置为活动?有一个带有片段的活动,其中一个片段的按钮打开对话框,并且在共享首选项中有一些用于更改颜色的按钮。它有效,但仅在重新加载活动时才有效。

我的对话是:

import android.content.Context;
import android.content.SharedPreferences;
import android.graphics.Color;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.DialogFragment;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.EditText;
import android.widget.LinearLayout;

import static com.hgyghyfghyu.apkana40.AppData.FCOLOR_KEY;
import static com.hgyghyfghyu.apkana40.AppData.TRANSP_KEY;
import static com.hgyghyfghyu.apkana40.AppData.editordata;
import static com.hgyghyfghyu.apkana40.AppData.prefdata;
// ...

public class SettingsFColorDialod extends DialogFragment {


    public SettingsFColorDialod() {
    }

    public static SettingsFColorDialod newInstance(String title) {
        SettingsFColorDialod frag = new SettingsFColorDialod();
        Bundle args = new Bundle();
        args.putString("Choose your color", title);
        frag.setArguments(args);
        return frag;
    }

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

    @Override
    public void onViewCreated(final View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        prefdata = this.getActivity().getSharedPreferences("pref", Context.MODE_PRIVATE);
        editordata = prefdata.edit();

        view.findViewById(R.id.FCOLOR1).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                editordata.putString(FCOLOR_KEY,"FF9999").apply();
                changecolors();
                dismiss();
            }
        });




        String title = getArguments().getString("Choose your color", "Choose your color");
        getDialog().setTitle(title);
        getDialog().getWindow().setSoftInputMode(
                WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
    }

    private void changecolors(){
        prefdata = this.getActivity().getSharedPreferences("pref", Context.MODE_PRIVATE);
        getView().findViewById(R.id.mainavatarbck).setBackgroundColor(Color.parseColor(prefdata.getString(TRANSP_KEY, "#CC") + prefdata.getString(FCOLOR_KEY, "33777F")));
        getView().findViewById(R.id.mainnamebck).setBackgroundColor(Color.parseColor(prefdata.getString(TRANSP_KEY, "#CC") + prefdata.getString(FCOLOR_KEY, "33777F")));

    }
}

问题出在“changecolors”中,我尝试创建此方法来更改背景颜色而不刷新但出现错误(不幸的是应用程序已停止),并且来自 android 监视器:

FATAL EXCEPTION: main
                                                                          Process: com.hgyghyfghyu.apkana40, PID: 22743
                                                                          java.lang.NullPointerException
                                                                              at com.hgyghyfghyu.apkana40.SettingsFColorDialod.changecolors(SettingsFColorDialod.java:176)
                                                                              at com.hgyghyfghyu.apkana40.SettingsFColorDialod.access$000(SettingsFColorDialod.java:23)
                                                                              at com.hgyghyfghyu.apkana40.SettingsFColorDialod$16.onClick(SettingsFColorDialod.java:159)
                                                                              at android.view.View.performClick(View.java:4438)
                                                                              at android.view.View$PerformClick.run(View.java:18422)
                                                                              at android.os.Handler.handleCallback(Handler.java:733)
                                                                              at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                              at android.os.Looper.loop(Looper.java:136)
                                                                              at android.app.ActivityThread.main(ActivityThread.java:5045)
                                                                              at java.lang.reflect.Method.invokeNative(Native Method)
                                                                              at java.lang.reflect.Method.invoke(Method.java:515)
                                                                              at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
                                                                              at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
                                                                              at dalvik.system.NativeStart.main(Native Method)

【问题讨论】:

  • 你在哪个文件中调用changecolor()?
  • mainavatarbckmainnamebck 是 Textview 还是 LinearLayouts ??
  • @jankigadhiya mainavaterbck 和 mainnamebck 是 MainActivity 中的 LinearLayouts
  • 我认为您需要将膨胀的布局存储在视图中。在findViewById 期间使用该视图。

标签: java android android-fragments android-studio


【解决方案1】:

如果崩溃发生在changecolors() 的第一行,可能是因为this.getActivity() 返回null。

确保在onAttach() 或之后调用getActivity(),否则它将返回null。 fragment 尚未与活动关联。

【讨论】:

  • 你是对的,问题出在这一行:getView().findViewById(R.id.mainavatarbck).setBackgroundColor(Color.parseColor(prefdata.getString(TRANSP_KEY, "#CC") + prefdata .getString(FCOLOR_KEY, "33777F")));我应该在哪里使用 onAttach()?
  • @Aditya 我在对话框中使用它,而不是在片段中(但对话框是通过片段中的单击按钮打开的)
【解决方案2】:

R.id.mainavatarbckR.id.mainnamebck 在您的片段布局中找不到,这就是 getView().findViewById() 返回 null 的原因。试试这个 -

根据您的问题,我假设具有这 2 个 ID 的视图是您的活动布局的一部分。将 changecolors() 方法中的代码更改为 -

getActivity().findViewById(R.id.mainavatarbck)...

【讨论】:

    猜你喜欢
    • 2018-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-28
    • 2020-04-24
    • 1970-01-01
    • 2018-05-23
    • 1970-01-01
    相关资源
    最近更新 更多