【问题标题】:Call a View from a class which extends Activity从扩展 Activity 的类中调用视图
【发布时间】:2017-08-08 21:02:46
【问题描述】:

我有一个扩展 Activity 的 java 类(不是 AppCompatActivity!)。

现在我想调用一个在 .xml 文件中定义的视图。
我该怎么做?
我的应用程序不断崩溃,但如果我让 .java 类扩展 AppCompatActivity,它不会。

关于如何解决这个问题的任何想法?

遗憾的是它必须扩展 Activity。

.java 类

public class pop extends Activity {

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

        DisplayMetrics dm = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(dm);

        int width = dm.widthPixels;
        int height = dm.heightPixels;

        getWindow().setLayout((int) (width * .8), (int) (height * .4)); // Width * 0,8 == 80% der Fenstergröße

        back.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //Thats where it fails, because it couldnt get the parent-view.
                parent.setBackgroundColor(Color.argb(250,0,0,0));
                finish();
            }
        });
    }

}

pop.java

public class pop extends Activity {

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

    }

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

        back.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //Thats where it fails, because it couldnt get the parent-view.
                parent.setBackgroundColor(Color.argb(250,0,0,0));
                finish();
            }
        });

        sure.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

            }
        });
    }

}

我已经找到了解决方案,谢谢大家的帮助!我真的很感激!

【问题讨论】:

  • 请添加您的堆栈跟踪和您的 popup.xml
  • 编辑您的问题以包括堆栈跟踪/日志以及相关布局。这将帮助人们确定原因并提供答案。
  • 如果删除import android.support.v7.app.AppCompatActivity; 会发生什么?我不相信您可以从中使用任何东西,因为它是您正在使用的活动。即,当您删除它时查看受影响的内容可能会突出问题/原因。
  • 这没什么区别@MikeT,我试过了。
  • 尝试用((RelativeLayout)view.getParent()).setBackgroundColor(Color.argb(250,0,0,0));替换parent.setBackgroundColor(Color.argb(250,0,0,0));

标签: java android android-activity


【解决方案1】:

这是使用onResume 的一种方式(如 cmets 中所述),它基本上都是在调用活动中处理的,基本上是通过设置一个变量来指示弹出活动已经开始(注意,您可能正在使用对话框,单击对话框外的对话框将具有相同的效果)。

这是相当有限的。

public class MainActivity extends AppCompatActivity {

    boolean resumestate = false;
    LinearLayout ll; //The main layout

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

        ll = (LinearLayout) findViewById(R.id.mainactivity_ll);

    }

    // Invoke the pop activity, setting resumestate to indicate this      
    public void doTestButton(View v) {
        Toast.makeText(this,"You Clicked the Test Button",Toast.LENGTH_SHORT).show();
        Intent intent = new Intent(this,Pop.class);
        startActivity(intent);
        resumestate = true;
    }

    //Check if the activity was invoked and if so set background colour
    @Override
    protected void onResume() {
        super.onResume();
        if (resumestate) {
            ll.setBackgroundColor(Color.argb(250,0,0,0));
            resumestate = false;
        }
    }
}

另一种方式,使用startActivityForresult,从而通过返回的 Intent 返回背景颜色(更灵活):-

MainActivity

public class MainActivity extends AppCompatActivity {

    boolean resumestate = false;
    LinearLayout ll;
    int requestcode = 10;

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

        ll = (LinearLayout) findViewById(R.id.mainactivity_ll);

    }

    public void doTestButton(View v) {
        Toast.makeText(this,"You Clicked the Test Button",Toast.LENGTH_SHORT).show();
        Intent intent = new Intent(this,Pop.class);
        startActivityForResult(intent,requestcode);
        resumestate = true;
    }

    @Override
    protected void onActivityResult(int rqstcode, int resultcode, Intent data) {
        if (rqstcode == requestcode) {
            if (resultcode == Activity.RESULT_OK) {
                int newcolour = data.getIntExtra("BGRNDCOLOUR",Color.argb(250,48,48,48));
                ll.setBackgroundColor(newcolour);
            }
        }
    }
}

pop活动中按钮的onClick方法:-

public void doTestButton(View v) {
    int newcolour = Color.argb(250,128,128,128);
    Intent ri = new Intent();
    ri.putExtra("BGRNDCOLOUR", newcolour);
    setResult(Activity.RESULT_OK,ri);
    finish();
}

我认为可能被认为是不好的做法的第三种方法是创建一个public static 方法来更改背景,同时为相应的布局声明静态变量。

例如在 mainactivty 中,将 LinearLayout ll; 替换为 static LinearLayout ll;,然后将适当的方法添加到主要活动中,例如

    public static void alterBackGroundColour(int newcolour) {
        ll.setBackgroundColor(newcolour);
    }

然后在pop活动中的适当位置使用:-

    MainActivity.alterBackGroundColour(Color.argb(250,128,0,128));

【讨论】:

  • @Sarius 太好了,如果您发现答案有用,我将不胜感激您将其标记为已回答并投票赞成。
  • 没问题的老兄
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-26
相关资源
最近更新 更多