点击按钮后不起作用

4

我有一个奇怪的问题。当我运行应用并点击按钮(btn_eng或btn_pl)时,在logcat中我会看到日志(“Erase dialog”或“Erase dialog PL”),但下一次点击时它不会出现,按钮也不执行其onClick操作。 我尝试制作按钮来更改语言。在我的应用程序中,我有一个对话框,其中包含来自资源的数据表单(字符串数组),当我更改语言时,我希望清除对话框并使用相应的数据创建新对话框。

    //public static Activity act; -> before onCreate(..)
    this.act = this;

    Button btn_eng = (Button) findViewById(R.id.btnEN);
    btn_eng.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            Log.d("XXX", "Erase dialog");
            act.removeDialog(1);
            Locale locale = new Locale("en");
            Locale.setDefault(locale);
            Configuration config =   act.getBaseContext().getResources().getConfiguration();
            config.locale = locale;
            act.getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics());
            act.setContentView(R.layout.main);

        }
    });

    Button btn_pl = (Button) findViewById(R.id.btnPL);
    btn_pl.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            Log.d("XXX", "Erase dialog PL");
            act.removeDialog(1);
            Locale locale = new Locale("pl");
            Locale.setDefault(locale);
            Configuration config =   act.getBaseContext().getResources().getConfiguration();
            config.locale = locale;
            act.getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics());

            act.setContentView(R.layout.main);
        }
    });
3个回答

3
由于您在 onClick 中重置了内容视图,所以出现了这种情况。调用 setContentView 不会导致 onCreate 被运行 - 这就是(我猜测)您将 onClick 监听器链接到按钮的地方。它确实会导致一个全新的布局实例被显示。您需要找到一种新的方法来刷新屏幕,而不是用新数据替换屏幕。最好的方法是获取您活动的包装 ViewGroup 并调用 View#invalidate();

你是正确的,我用了 act.getWindow().getDecorView().findViewById(android.R.id.content).invalidate(); 代替 act.setContentView(R.layout.main);,现在它可以正常工作 :) - plancys
这有所帮助,但这个解决方案只适用于strings.xml(在此操作之后,它们会在应用程序中更新),但这种方法不会更改按钮 - 我看到的是来自drawable而不是drawable-en的按钮,后者将是理想的解决方案。 - plancys

0
尝试在每个Onclicklistener中删除setcontentView()调用,并尝试放置以下代码并进行测试。
Button btn_eng = (Button) findViewById(R.id.btnEN);
btn_eng.setOnClickListener(new View.OnClickListener() {

    @Override
    public void onClick(View v) {
        Log.d("XXX", "Erase dialog");
        act.removeDialog(1);
        if(v.getId()==R.id.btnEN){
        Locale locale = new Locale("en");
        Locale.setDefault(locale);
        Configuration config =   act.getBaseContext().getResources().getConfiguration();
        config.locale = locale;
        act.getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics());

   }
    }
 });

Button btn_pl = (Button) findViewById(R.id.btnPL);
btn_pl.setOnClickListener(new View.OnClickListener() {

    @Override
    public void onClick(View v) {
        Log.d("XXX", "Erase dialog PL");
        act.removeDialog(1);
     if(v.getId()==R.id.btnPL){
        Locale locale = new Locale("pl");
        Locale.setDefault(locale);
        Configuration config =   act.getBaseContext().getResources().getConfiguration();
        config.locale = locale;
        act.getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics());

    }
   });

请分享结果,并在您那里确认是否正常工作,因为在我这边一切正常。


0

setContentView(R.layout.main); 调用多次是不允许的,如果你想改变屏幕内容,你应该在你的 Layout/.xml 文件中拥有 Layouts/Views/ViewGroups 并更新它们,而不是再次调用 setContentView。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接