2015-09-05 85 views
1

我在MyView類中創建了自定義視圖,並且想要在我的MainActivity類中使用onSharedPreferenceChanged方法顯示或隱藏mLevel修改其他類的自定義視圖Android

這裏是MyView.java

public class MyView extends LinearLayout { 

    private final TextView mLevel; 

    public StatusBarView(Context context) { 
     this(context, null, 0); 
    } 

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

    public StatusBarView(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 

     setGravity(Gravity.CENTER_VERTICAL); 

     LayoutInflater.from(context).inflate(R.layout.my_level_view, this); 

     mLevel = (TextView) findViewById(R.id.levelTextView); 
    } 

    public void showLevel(boolean bShowLevel) { 
    if (bShowLevel) { 
     mLevel.setVisibility(View.VISIBLE); 
     mLevel.setText(mService.getLevel()); 
    } else { 
     mLevel.setVisibility(View.GONE); 
    } 
} 
} 

在這裏,我有MainActivity.java

public class MainActivity extends AppCompatActivity { 

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

    // Display the fragment as the main content. 
    getFragmentManager().beginTransaction().replace(android.R.id.content, new PrefsFragment()).commit(); 
} 

public class PrefsFragment extends PreferenceFragment 
     implements SharedPreferences.OnSharedPreferenceChangeListener { 

    private TextView mLevel; 

    private LevelService mLevelService = new LevelService(); 

    private MyView mMyView = new MyView(getBaseContext()); 

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

     // Load the preferences from an XML resource 
     addPreferencesFromResource(R.xml.preferences); 

     mLevel = (TextView) findViewById(R.id.levelTextView); 
    } 

    @Override 
    public void onResume() { 
     super.onResume(); 

     getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this); 
    } 

    @Override 
    public void onPause() { 
     super.onPause(); 

     getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this); 
    } 


    @Override 
    public void onSharedPreferenceChanged(SharedPreferences prefs, String key) { 

     if (key.equals("showLevel")) { 
      mMyView.showLevel(prefs.getBoolean("showLevel", false));  
     } 

    } 

} 

但我的應用程序崩潰時我上的複選框挖掘與showLevel關鍵。在Android Studio中,我從這一行開始得到NullPointerException:mLevel.setVisibility(View.VISIBLE);當試圖從另一個類而不是MyView修改視圖(它工作得很好)。

任何幫助,高度讚賞。

更新:我在MyView裏添加了一個showLevel()方法,並嘗試在服務中訪問它。加工。

+0

片段的onCreateView()方法是什麼? – Breavyn

+0

這就是我在'MainActivity'中所具有的,沒有'onCreateView()'。無論如何,我無法修改我的其他課程中的視圖,而不僅僅是主視圖。 –

+0

在'activity_main.xml'中聲明瞭'levelTextView'嗎? – Breavyn

回答

0

替換你的代碼,

public class MainActivity extends AppCompatActivity implements SetVisibilityInterface{ 

private TextView mLevel; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    mLevel = (TextView) findViewById(R.id.levelTextView); 
    // Display the fragment as the main content. 
    getFragmentManager().beginTransaction().replace(android.R.id.content, new PrefsFragment(this)).commit(); 
} 

@Override 
public void setVisibilityInterfaceAndData(int visibility, String value) { 
    if(visibility==View.VISIBLE){ 
     mLevel.setVisibility(View.VISIBLE); 
     mLevel.setText(value); 
    }else { 
     mLevel.setVisibility(View.GONE); 
    } 
} 

public class PrefsFragment extends PreferenceFragment 
     implements SharedPreferences.OnSharedPreferenceChangeListener { 

    private TextView mLevel; 
    private Context mContext; 
    private LevelService mLevelService = new LevelService(); 
    private SetVisibilityInterface mySetVisibilityInterface; 

    public PrefsFragment(Context context) { 
     mContext = context; 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     // Load the preferences from an XML resource 
     addPreferencesFromResource(R.xml.preferences); 
    } 

    @Override 
    public void onResume() { 
     super.onResume(); 
     getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this); 
    } 

    @Override 
    public void onPause() { 
     super.onPause(); 
     getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this); 
    } 

    @Override 
    public void onSharedPreferenceChanged(SharedPreferences prefs, String key) { 
     if (key.equals("showLevel")) { 
      try { 
       mySetVisibilityInterface = (SetVisibilityInterface) mContext; 
       if (prefs.getBoolean("showLevel", false)) { 
        mySetVisibilityInterface.setVisibilityInterfaceAndData(View.VISIBLE, mService.getLevel()); 
       } else { 
        mySetVisibilityInterface.setVisibilityInterfaceAndData(View.GONE, ""); 
       } 
      } catch (ClassCastException e) { 
       throw new ClassCastException(mContext.toString() 
         + " must implement SetVisibilityInterface"); 
      } 
     } 
    } 
} 
} 

而且回調,你需要的界面,

public interface SetVisibilityInterface { 
public void setVisibilityInterfaceAndData(int visibility, String value); 
} 

讓我知道它是否適合你,

和馬克作爲回答,以便它對其他人有用...

+0

感謝您的幫助,但我試圖在MainActivity類的自定義視圖中修改/更新'mLevel',而不是在Fragment內部創建另一個'mLevel',它由方式是PreferenceScreen。 –

+0

那麼你不能改變可見性,你會得到一個異常,因爲來自另一個類的View不能從其他類中修改。您將不得不調用該類的方法,並在那裏設置可見性。 –

+0

查看我的更新回答 –