在两个活动之间传递视图的方法

5

我想在两个活动之间传递视图。

在我的第一个活动中,当点击按钮时,我使用了 Intent 来跳转到另一个活动。

我在第一个活动中编写了这一行代码 setContentView(R.layout.main);,并声明了一个 graphView

现在的问题是,我想在第二个活动中填充 graphView 但它的引用即 mySimpleXYPlot = (XYPlot) findViewById(R.id.mySimpleXYPlot); 存在于第一个活动中。

那么我该如何在第二个活动中访问 mySimpleXYPlot 呢?

如果我使用

 setContentView(R.layout.main);
 mySimpleXYPlot = (XYPlot) findViewById(R.id.mySimpleXYPlot);

在第二个活动中,整个布局会被重新启动,我不希望发生这种情况:(
任何帮助都将不胜感激!
2个回答

1

如果你想在另一个类或活动中使用声明为静态公共的同一实例,那么可以这样做:

编辑...

在第一个活动中,按照以下方式操作:

public class MyActivity1 extends Activity{
    public static XYPlot mySimpleXYPlot;

    public onCreated(Bundle b){
       setContentView(R.layout.main);
       mySimpleXYPlot = (XYPlot) findViewById(R.id.mySimpleXYPlot);
       // start you 2nd activity from button
    }
}

在Activity2中使用这种方式。
public class MyActivity2 extends Activity{
    private XYPlot mySimpleXYPlot;
    public onCreated(Bundle b){
       setContentView(R.layout.main); 
       mySimpleXYPlot = MyActivity2.mySimpleXYPlot;
       // use mySimpleXYPlot as per your requirement
    }
}

我不确定这个能否完美地工作,但可以尝试这种方式,并观察发生了什么。

编辑2

不要将组件添加到 XML 布局文件中,而是在 onCreate 时间添加。

我的布局文件看起来像这样:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 
   xmlns:android="http://schemas.android.com/apk/res/android"   
   android:layout_width="fill_parent"
   android:layout_height="fill_parent"
   android:orientation="vertical"
   android:id="@+id/main_linear"
   >
  <Button android:id="@+id/btn1" android:text="Click" android:layout_width="wrap_content"
      android:layout_height="wrap_content" />
</LinearLayout>

我的第一个活动

    public static EditText edittext;
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.test);
    //edittext = (EditText) findViewById(R.id.edittext);
    final LinearLayout ll = (LinearLayout) findViewById(R.id.main_linear);

    edittext = new EditText(getApplicationContext());
    edittext.setId(1);
    edittext.setText("text change");
    ((Button)findViewById(R.id.btn1)).setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            edittext.setText(edittext.getText().toString());
            ll.removeView(edittext);
            startActivity(new Intent(TestLinear.this,TestClass.class));
        }
    });
    ll.addView(edittext);
}

你需要先从布局中移除那个作为子元素添加的组件

    private static EditText edittext;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.test);
    LinearLayout ll = (LinearLayout) findViewById(R.id.main_linear);
    getEdit();
    ((Button)findViewById(R.id.btn1)).setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            Log.v("test", edittext.getText().toString());
        }
    });
    ll.addView(edittext);
}
static void  getEdit(){
    edittext = TestLinear.edittext;
}

我知道这不是完美的方法。另一种方法是将其值存储在自定义类中,例如setter/getter,并在活动中使用。


在第二个活动布局中,您使用的是主要布局还是不同的布局,请更新您的问题,说明您已经尝试了什么。 - Pratik
让我解释一下。我已经在main.xml中创建了整个布局。我在第一个活动中将内容设置为此布局。现在,我想用两个数组在图表上绘制点。在buttonClick上,我将这两个数组传递到第二个活动,并尝试在图表上显示它们。但是这样做会破坏整个布局。我想要传递在_第一个活动_中创建的mySimpleXYPlot,而不是在_第二个活动_中再次创建它。 - GAMA
我已经完成了一个例子,但它太复杂了,请检查编辑2。 - Pratik
当我点击按钮并导航到另一个活动时,图表会显示出来,但所有的onClickListeners和类似的功能都无法使用。也就是说,如果我在活动1中有某个按钮点击的特定功能,然后我导航到第二个活动,那么该按钮的功能将丢失,因为该按钮的onClickListner存在于活动1中而不是活动2中。 - GAMA

0

只需在第二个内容视图中添加相同的xml。如果您必须在多个视图中使用布局的特定部分,请将其放入单独的xml中并进行包含。


将您想要使用的视图元素放在一个名为plotviews.xml或类似名称的单独xml文件中,然后在您希望拥有绘图视图的内容视图中放置<layout include="@layout/plotviews" />。这样,您可以在两个活动中通过findViewById获取视图。 - schlingel
“布局的其他部分不工作”是什么意思?记得在调用setContentView()后需要重新设置所有的clickListener及其他处理程序。 - Shailendra Singh Rajawat
抱歉,我没有完全明白。我需要在两个活动中都使用 setContentView(R.layout.main) 吗?还是只在第一个活动中使用?如果我在第二个活动中不写 setContentView(R.layout.main) ,我会得到 nullPointerException - GAMA
抱歉,一开始我没有理解你的问题。我以为你想在第二个活动中拥有第二个绘图视图。你应该使用startActivityForResult http://developer.android.com/reference/android/app/Activity.html,将要绘制的数据打包成可传递或可序列化的包裹,并在持有绘图视图的活动中处理它。 - schlingel
我找不到一个使用parcel来封装视图的示例。它是否只能封装int、string等,而不能封装视图? - GAMA

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