java - 修改来自另一个Android类的自定义 View

标签 java android xml

我在 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/

相关文章:

java - 无法将 Spring 5 应用程序部署到 Payara

android - ndk 在 android.mk 文件中构建时出现错误

java - 如何知道 Activity 已经完成?

android - 如何在我按返回时关闭应用程序?

python - BeautifulSoup 迭代多个 XML 标签,提取字符串列表

java - JAXB键值问题

python - 打印 xml 节点 python xtree

java - HttpURLConnection 连接重置错误处理

java - 如何使用 ListObjectsV2Request 上的前缀或分隔符过滤 AWS 中的键?

java - 如何在java中为列表分配对象类型?