如何动态添加动态设置ID的自定义布局?

时间:2013-09-14 11:43:11

标签: java android android-layout android-intent android-listview

我有main.xml布局和其他布局other.xml,其中包含多个子元素(TextView, ImageView)。我想要做的是动态添加到main.xml作为可滚动列表other.xml元素。实际上做到这一点我使用循环:

    LayoutInflater layoutInflaterInstance = (LayoutInflater)getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View view;
    View insertPoint = findViewById(R.id.linearLayoutToKeepOtherLayouts);


for (int i = 0; i < numberOfOtherXmlLayouts; i++) {
view = layoutInflaterInstance.inflate(R.layout.otherXml, null);

TextView firstValueOfOtherXml = (TextView) view.findViewById(R.id.first);
TextView secondValueOfOtherXml = (TextView) view.findViewById(R.id.second);
ImageView thirdValueOfOtherXml = (ImageView) view.findViewById(R.id.third);

firstValueOfOtherXml = setContent();
secondValueOfOtherXml = setContent();
thirdValueOfOtherXml = setContent();

((ViewGroup) insertPoint).addView(view, i, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT));

}

这是我向现有main.xml添加动态内容的方法。现在我想在firstValueOfOtherXml / secondValueOfOtherXml / thirdValueOfOtherXml中添加一些活动,我尝试在TextView / ImageView中的onClick中设置other.xml事件,如下所示(在上面循环):

RelativeLayout relativeLayout = (RelativeLayout) findViewById(R.id.otherXmlID);
                View.OnClickListener clickListener = new View.OnClickListener() {

                    @Override
                    public void onClick(View v) {
                        setContentView(R.layout.otherXml);
                        Intent myIntent = new Intent(getApplicationContext(), OtherActivity.class);
                        startActivityForResult(myIntent, 0);

                    }
};
relativeLayout.setOnClickListener(clickListener);

不幸的是,它仅适用于添加到other.xml的第一个main.xml布局。我认为问题在于添加了other.xml的ID,我没有动态地改变它(可能在for循环中根据i)。我希望在任何解决方案中添加动态布局元素与其子元素的dinamically更改ID,以使其识别成为可能。

希望它足够清楚。 谢谢你的帮助。

2 个答案:

答案 0 :(得分:0)

你误解了android项目的模式: 活动是每件事情发生的环境。每个Activity都有它的视图,可以使用setContentView进行设置,因此当您使用setContentView时,实际上是在设置当前活动的视图。

你要做的第一件事是启动一个Activity(这是全局上下文),然后你在Activity中做你需要做的任何工作

所以你应该像你一样开始新的活动:

     @Override
     public void onClick(View v) {
           Intent myIntent = new Intent(getApplicationContext(), OtherActivity.class);
           startActivityForResult(myIntent, 0);
     }

在您的OtherActivity类的onCreate方法中,您应该将setContentView设置为要应用于新当前活动的任何布局xml文件。

Xml文件仅用于描述视图。(实际上,您可以使用Java来执行此操作)

答案 1 :(得分:0)

由于我对活动“模式”的误解,YAT的回答被接受了。我的问题的解决方案(切换到其他活动填充layout.xml与适当的数据)是在RelativeAayout上使用onClick =“switchToWeekWeather”与WeatherActivity.java类中的:

public void switchToWeekWeather(View view){

    TextView cityNameTextView = (TextView) ((RelativeLayout) view).getChildAt(1);
    Intent myIntent = new Intent(getApplicationContext(), CityWeatherActivity.class);
    String cityName = cityNameTextView.getText().toString();
    myIntent.putExtra("name", cityName);
    startActivity(myIntent);

}

在CityWeatherActivity.java中:

 public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Bundle extras = getIntent().getExtras();
        String value = "";
        if (extras != null) {
            value = extras.getString("name");
        }

        LinearLayout cityView = (LinearLayout) getLayoutInflater().from(this).inflate(R.layout.cityview, null);
        TextView cityTextView = (TextView) cityView.findViewById(R.id.cityName);
        cityTextView.setText(value);
        setContentView(cityView);

    }

    public void backToMain(View view) {

            Intent myIntent = new Intent(getApplicationContext(), WeatherActivity.class);
            startActivity(myIntent);

    }