我在 MyView 类中创建了一个自定义 View ,并希望在 MainActivity 类中使用 onSharedPreferenceChanged
方法显示或隐藏 mLevel
。
这是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 中,当尝试从另一个类而不是 MyView 修改 View (它工作得很好)时,我从这一行开始得到 NullPointerException: mLevel.setVisibility(View.VISIBLE);
。
非常感谢任何帮助。
更新:我在 MyView
中添加了 showLevel()
方法,并尝试在服务中访问它。工作。
最佳答案
将您的代码替换为,
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");
}
}
}
}
}
对于回调,您将需要接口(interface),
public interface SetVisibilityInterface {
public void setVisibilityInterfaceAndData(int visibility, String value);
}
请告诉我它是否适合您,
并标记为答案,以便对其他人有用...
关于java - 修改来自另一个Android类的自定义 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32412828/