找不到上下文丢失的地方

问题描述 投票:0回答:1

我一直在重构以前的项目以使用片段,而不是创建单独的活动作为学校作业。我一直在尝试找出此错误的位置已近一个小时,而且没有运气。添加此行canvas.setColor(color, position);

时上下文丢失

这是主要活动:

    public class MainActivity extends AppCompatActivity implements PaletteFragment.SpinnerSelectedInterface {

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

            PaletteFragment palette = PaletteFragment.newInstance();

            Bundle bundle = new Bundle();
            bundle.putStringArray(KeyData.PASS_COLOR, getResources().getStringArray(R.array.colors));
            bundle.putStringArray(KeyData.PASS_POSITION, getResources().getStringArray(R.array.colorNames));
            palette.setArguments(bundle);

            getSupportFragmentManager().beginTransaction().add(R.id.palette_fragment, palette).commit();
        }

        @Override
        public void setCanvasColor(String color, int position) {
            CanvasFragment canvas = CanvasFragment.newInstance(null);
            getSupportFragmentManager().beginTransaction().add(R.id.canvas_fragment, canvas).addToBackStack(null).commit();
            canvas.setColor(color, position);
        }
    }

这是片段:

public class CanvasFragment extends Fragment {
    private TextView displayColor;
    private View background;

    public CanvasFragment() {
        // Required empty public constructor
    }

    public static CanvasFragment newInstance(Bundle bundle) {
        CanvasFragment fragment = new CanvasFragment();
        fragment.setArguments(bundle);
        return fragment;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.fragment_canvas, container, false);
        displayColor = (TextView) v.findViewById(R.id.displayColor);
        background = (View) v.findViewById(R.id.canvas_fragment);
        return v;
    }

    public void setColor(String color, int position){
        String[] names = getResources().getStringArray(R.array.colorNames);
        displayColor.setText(names[position]);
        background.setBackgroundColor(Color.parseColor(color));
    }

我已经尝试在画布片段上重写onAttach和onDetach并添加消息侦听器,但仍然会收到错误。希望能引导我朝正确的方向前进。

错误

java.lang.IllegalStateException: Fragment CanvasFragment{69925d5 (240edefb-318c-4983-bd15-cf45142e849a) id=0x7f080047} not attached to a context.

android android-fragments illegalstateexception
1个回答
0
投票

通话时

getSupportFragmentManager()
    .beginTransaction()
    .add(R.id.canvas_fragment, canvas)
    .addToBackStack(null)
    .commit();

您正在使用commit()。按照its Javadoc

安排此事务的提交。 提交不会立即发生;将在下次线程就绪时将其安排为主线程进行工作。

因此,当您之后立即直接调用canvas.setColor(color, position)时,该片段未附加,并且还没有与之关联的Context

如果要立即添加片段,则要使用commitNow(),这将强制事务立即发生。这样可以确保在调用setColor方法之前完成此操作:

getSupportFragmentManager()
    .beginTransaction()
    .add(R.id.canvas_fragment, canvas)
    .addToBackStack(null)
    .commitNow();
© www.soinside.com 2019 - 2024. All rights reserved.