0

我的用户应该能够在我的应用程序中更改(使用首选项)界面的外观(在视觉上动态启用和禁用某些布局)。

我正在使用 v4 ViewPager(确切地说是 PagerTabStrip)并试图在 onResume() 方法中更改它,就在用户关闭“设置菜单”以返回应用程序之后。

我可以通过这种方式更改变量,但似乎无法更改任何布局(我曾经使用 TabHosts,这非常有效)。如果我在 onCreateView() 方法中调用此方法,一切正常,但我不希望我的用户在任何更改可见之前强制关闭应用程序。

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    View v = null;
    vContainer = container; // global variable
    switch (mCurrentPage) {
    case 1:
        v = inflater.inflate(R.layout.lifepoints_layout,
                container, false);
        // irrelevant code
        InputStyleType = (LinearLayout) v
                .findViewById(R.id.llInputEditText);
        InputStyleButtons = (TableLayout) v
                .findViewById(R.id.tlInputButtons);

        InitializePreferences(); // <- this method
        break;
    case 2:
        // irrelevant code
        break;
    default:
        break;
    }
    return v;
}

这完美地工作,因为它应该。但是,当通过 onResume() 调用代码时,程序崩溃了!

@Override
public void onResume() {
    super.onResume();
    if (isPaused)
        InitializePreferences();
    isPaused = false;
} 

这是方法本身:

public void InitializePreferences() {
    SharedPreferences getPreferences = PreferenceManager
            .getDefaultSharedPreferences(getActivity().getBaseContext());
    prefInput = getPreferences.getBoolean("pref_input", true);
    prefFb = getPreferences.getBoolean("pref_fb", false);

    if (prefInput) {
        InputStyleType.setVisibility(View.GONE);
        InputStyleButtons.setVisibility(View.VISIBLE);
    } else {
        InputStyleButtons.setVisibility(View.GONE);
        InputStyleType.setVisibility(View.VISIBLE);
    }
}

我已经尝试了很多,但似乎没有任何效果。除非从 onCreateView 直接调用它,否则我似乎无法更改任何布局,这似乎不正确。

编辑 1

我已经完全分析了我的方法,它被正确调用并且我已经用一些变量进行了测试。一切正常,直到我尝试更改用户可见的内容(祝酒词工作得很好)。

编辑 3

删除了 Edit 2,这就是我的代码目前所在的位置。它仍然无法正常工作,实际上有点混乱。我认为答案并不遥远。

public void InitializePreferences() {
    SharedPreferences getPreferences = PreferenceManager
            .getDefaultSharedPreferences(getActivity().getBaseContext());
    prefInput = getPreferences.getBoolean("pref_input", true);
    prefFb = getPreferences.getBoolean("pref_fb", false);

    if (isPaused) {
        getActivity().getWindow().getDecorView().invalidate();

        LayoutInflater inflater = (LayoutInflater) getActivity()
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View v = inflater.inflate(R.layout.lifepoints_layout, vContainer,
                false);

        InputStyleType = (LinearLayout) v.findViewById(R.id.llInputEditText);
        InputStyleButtons = (TableLayout) v
                .findViewById(R.id.tlInputButtons);

        InputStyleType.invalidate();
        InputStyleButtons.invalidate();
    }

    if (prefInput) {
        InputStyleType.setVisibility(View.GONE);
        InputStyleButtons.setVisibility(View.VISIBLE);
    } else {
        InputStyleButtons.setVisibility(View.GONE);
        InputStyleType.setVisibility(View.VISIBLE);
    }
}
4

1 回答 1

0

我认为您需要使您的观点无效。尝试将InputStyleType.invalidate()和添加InputStyleButtons.invalidate()到 InitializePreferences 方法。您可能还需要使包含 InputStyleType 和 InputStyleButtons 的视图父级无效。

编辑:在 onResume() 回调中试试这个:

LayoutInflater inflater = getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
inflater.inflate(R.layout.lifepoints_layout,
            container_2, false);

为了完成这项工作,请创建一个全局 ViewGroup 变量并将其值设置为containeronCreateView 回调中的值。

container_2 = container;
于 2013-02-12T22:21:29.940 回答