Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/194.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从另一个类修改自定义视图_Java_Android_Xml - Fatal编程技术网

Java 从另一个类修改自定义视图

Java 从另一个类修改自定义视图,java,android,xml,Java,Android,Xml,我已在MyView类中创建了一个自定义视图,并希望在我的MainActivity类中使用onSharedPreferenceChanged方法显示或隐藏mLevel 下面是MyView.java: public class MyView extends LinearLayout { private final TextView mLevel; public StatusBarView(Context context) { this(context, null,

我已在MyView类中创建了一个自定义视图,并希望在我的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);
    }
}
}
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));       
        }

    }

}
这里有
MainActivity.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);
    }
}
}
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
键点击复选框时,我的应用程序崩溃。在AndroidStudio中,我从这一行开始得到NullPointerException:
mLevel.setVisibility(View.VISIBLE)尝试从另一个类而不是MyView(在MyView中工作正常)修改视图时

非常感谢您的帮助


更新:我在
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");
            }
        }
    }
}
}
对于回调,您需要接口

public interface SetVisibilityInterface {
public void setVisibilityInterfaceAndData(int visibility, String value);
}
如果对你有效,请告诉我


并标记为答案,以便对其他人有用…

将您的代码替换为

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);
}
如果对你有效,请告诉我


并标记为答案,以便对其他人有用…

片段的
onCreateView()
方法中有什么?这是我在
MainActivity
中的内容,没有
onCreateView()
。无论如何,我不能在我的其他两个类中修改视图,不仅仅是在主类中。是否在
activity\u main.xml
中声明了
levelTextView
?否,它是在my\u level\u view.xml中声明的?片段的
onCreateView()
方法中有什么?这是我在
main activity
中声明的,没有
onCreateView()
。无论如何,我不能在我的其他两个类中修改视图,不仅仅是在主类中。是否在
activity\u main.xml
中声明了
levelTextView
?否,它是在my\u level\u view.xml中声明的谢谢您的帮助,但我正在尝试从主活动类在自定义视图中修改/更新
mLevel
,不要在片段内创建另一个
mLevel
,顺便说一句,这是一个首选项屏幕。那么您不能更改可见性,您将得到一个异常,因为无法从其他类修改另一个类的视图。您必须调用该类的一个方法,然后在那里设置可见性。看起来,如果我在
MyView.java
中创建一个方法,并从扩展服务的类运行它(在onStartCommand中),它将正确运行代码。但我需要它被更新,每次有一个在我的复选框的变化。可以使用服务的onStart命令添加我的PrefsFragment吗?谢谢你的帮助,但我正在尝试从MainActivity类在我的自定义视图中修改/更新
mLevel
,而不是在片段内创建另一个
mLevel
,顺便说一句,这是一个PreferenceScreen。那么你不能更改可见性,您将得到一个异常,因为无法从其他类修改来自其他类的视图。您必须调用该类的一个方法,然后在那里设置可见性。看起来,如果我在
MyView.java
中创建一个方法,并从扩展服务的类运行它(在onStartCommand中),它将正确运行代码。但我需要它被更新,每次有一个在我的复选框的变化。是否可以使用服务的onStart命令添加我的PrefsFragment?