【问题标题】:pass view from one activity to another将视图从一项活动传递到另一项活动
【发布时间】:2012-01-24 07:41:30
【问题描述】:

我正在尝试将视图从一个活动传递到另一个活动。

在我的第一个活动onButtonClick 中,我使用Intent 导航到另一个活动。

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

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

那么我如何才能在第二个活动中访问mySimpleXYPlot

如果我使用

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

在第二个活动中,整个布局重新启动,我不想发生这种情况:(

我们将不胜感激!

【问题讨论】:

    标签: java android view android-activity graph


    【解决方案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 并在活动中使用

    【讨论】:

    • 第二个活动布局是您使用的主要布局或不同布局,请更新您的问题,您已经尝试过什么
    • 让我解释一下。我在 main.xml 中创建了整个布局。我在第一个活动中将内容设置为此布局。现在我想用两个数组在图上绘制点。在 buttonClick 上,我将这两个数组传递给第二个活动并尝试在图表上显示它。但是这样做,整个布局就会受到干扰。我想 PASS mySimpleXYPlot 在 1st activity 中创建,而不是在 2nd activity 中再次CREATE
    • 我做了一个例子,但它太复杂了检查编辑2
    • 当我单击按钮并导航到另一个活动时,会显示图形,但不能使用所有 onClickListeners 和类似的东西。即,如果我在活动 1 中单击某些按钮时具有某些功能,然后导航到第二个活动,则该按钮的功能将丢失,因为该按钮的 onClickListener 存在于活动 1 而不是活动 2。
    【解决方案2】:

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

    【讨论】:

    • 将您要使用的视图元素放在名为 plotviews.xml 或类似内容的单独 xml 中,然后将 放在您想要的内容视图中有情节视图。这样您就可以在两个活动中通过 findViewById 获取视图。
    • “布局的其余部分不起作用”是什么意思。请记住,所有 clickListner 和其他处理程序都需要在调用 setContentView() 后再次设置。
    • 抱歉,我没听清楚。我需要在两个活动中使用setContentView(R.layout.main); 还是只在第一个活动中使用?如果我在第二次活动中不写setContentView(R.layout.main);,我会得到nullPointerException
    • 对不起,我一开始没有得到这个问题。我以为你想在第二个活动中有第二个情节视图。您应该使用 startActivityForResult developer.android.com/reference/android/app/Activity.html,将要绘制的数据打包为可解析或可序列化的数据包,并在包含绘图视图的活动中处理它。
    • 我找不到使用 parcel 打包视图的示例。是这样吗,它可以打包int,string等。但看不到?
    猜你喜欢
    • 2014-09-19
    • 2014-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多