2013-02-12 42 views
0

我的用戶應該能夠在我的應用程序中更改(使用首選項)界面的外觀(動態地啓用和禁用某些佈局)。Android - 無法使用v4更改佈局片段

我正在使用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

刪除編輯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); 
    } 
} 
+1

請附上帶有錯誤的日誌貓 – 2013-02-12 22:19:29

回答

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,並設置它的價值的container在onCreateView回調的價值。

container_2 = container; 
+0

我已經添加了代碼,但它似乎不起作用。由於我對這段代碼不熟悉,所以我可能自己做錯了什麼。 – Armadillo 2013-02-12 22:45:47

+0

嗯,我約99%確定你的問題是因爲一個視圖沒有被更新。嘗試在onResume()方法中重新膨脹視圖(如onCreateView())。看看是否能爲你解決它。 – Don 2013-02-12 22:54:56

+0

你能舉個例子嗎?因爲我還在掙扎。也許用上面的代碼?無論如何,thnx的幫助 – Armadillo 2013-02-12 23:22:40