【问题标题】:Get Variable from another Activity (Android Studio)从另一个活动中获取变量(Android Studio)
【发布时间】:2015-09-23 20:01:10
【问题描述】:

我知道这个问题已经有很多答案,但我仍然无法处理这个概念。

找到here 的答案显示:

如果您不想使用全局变量,您总是可以在您的活动中创建一个方法来返回您的字符串。

    public String getMyString(){
         return item; } 

然后在您当前的活动中,您可以调用:

    String myValue = LoginScreen.getMyString();

当我尝试此方法时,我收到一条错误消息,提示“无法从静态上下文引用非静态方法”。但是,如果我将方法设为静态,则表示我的变量需要是静态的,但我需要更新变量。我将在下面包含我的代码。


第一个活动 -

btnSEARCH.setOnClickListener(new View.OnClickListener() {
    public void onClick(View view) {
        if (editTextSearch.getText().toString() != null) {
            SearchQueryTerm = editTextSearch.getText().toString();
            editTextSearch.setText("");
        }
    }
});

public String getMyString(){
    return SearchQueryTerm;
}

第二个活动-

String SearchQueryTerm = MainActivity.getMyString();

非常感谢您在这方面给我的任何帮助。非常感谢!!


这是我更新的代码 - 但是它仍然崩溃:(

活动一

public void sendMessageIntent(View view) {
    Intent search_intent = new Intent(this, SearchActivity.class);
    api_intent.putExtra("my_variable", SearchQueryTerm);
    startActivity(search_intent);
}

xml文件

 <Button
        android:id="@+id/button_view"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="right"
        android:text="View"
        android:onClick="sendMessageIntent"
        />

活动 2 -

public String SearchQueryTerm

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_enter_variable);

        if (extras != null) {
            SearchQueryTerm = extras.getString("my_variable");
        }
}

【问题讨论】:

  • 你试过getter和setter方法吗?这样您就可以创建说: setString(SearchQueryTerm);然后在第二个活动中调用 String newString = new MainActivity.getString();如果您不熟悉 getter / setter 方法,请告诉我,我可以尝试更好地解释。
  • 我想知道你到底想要达到什么目的。你想开始一个新的活动并传递你的搜索查询吗?然后你应该按照here 的建议使用 Intent。如果要使用静态字段,则字段和方法都必须是静态的。您的 Activity 的所有实例都将共享同一个静态变量。
  • 大家好,非常感谢你们的 cmets。无论哪种方式,我都会研究 getter 和 setter 方法,非常感谢!!为了回答您的问题,我正在尝试启动一个新活动以返回在线数据库的查询结果,因为由于某种原因,同一活动中的 Web 视图对我来说无法正常工作。输入值(因此它不能是静态的),发送到第二个活动,然后使用该值查询数据库

标签: java android


【解决方案1】:

使用对象 Intent 的 putExtra 方法。

在您的第一个活动中创建例如:

String value = "value";
Intent i = new Intent(getApplicationContext(), MyActivity.class);
i.putExtra("my_variable",value);
startActivity(i);

在您的第二个活动中,您可以检索您的变量:

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

这是在活动之间传递变量的最佳方法。


为了向你展示它是如何工作的,我已经完成了这段代码:

第一个活动的 XML :

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">
        <EditText
            android:id="@+id/editTextSearch"
            android:layout_width="200dp"
            android:layout_height="wrap_content" />

        <Button
            android:id="@+id/buttonSearch"
            android:layout_width="200dp"
            android:layout_height="wrap_content"
            android:text="Button"/>
    </LinearLayout>

</RelativeLayout>

第一个活动:

public class MainActivity extends AppCompatActivity {

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

        Button btnSEARCH = (Button) findViewById(R.id.buttonSearch);

        btnSEARCH.setOnClickListener(new View.OnClickListener() {
            public void onClick(View view) {
                EditText editTextSearch = (EditText) findViewById(R.id.editTextSearch);
                if (editTextSearch.getText().toString() != null) {
                    String value = "value";
                    Intent i = new Intent(getApplicationContext(), Main2Activity.class);
                    i.putExtra("SearchQueryTerm",editTextSearch.getText().toString());
                    startActivity(i);
                    editTextSearch.setText("");
                }
            }
        });
    }

}

在第一个活动中,我们在 putExtra 方法中使用 key = "SearchQueryTerm" 传递 editText 的值。

要检索 editText 的值,请在您的第二个 Activity 中执行此操作:

public class Main2Activity extends AppCompatActivity {

    String SearchQueryTerm = null;

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

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

        System.out.println(SearchQueryTerm);
    }

}

现在您在变量 SearchQueryTerm ( Second Activity ) 中获得了 editText 的值。

它适合我,所以它没有理由不适合你。

希望对你有帮助。

【讨论】:

  • 非常感谢您的帮助!!我试图将它添加到我的代码中,但现在它只是让我的新活动崩溃。你能检查一下我是否做得对吗?我已将代码添加到原始问题中,因为 cmets 中的格式不能很好地显示代码
  • 没问题,编辑你的答案,告诉我你做了什么。
【解决方案2】:

一个好的解决方案是添加一个“模型”单例类,您可以在其中存储必须在活动之间共享的数据

示例:

public class Model {
private static Model __instance == null;

private Model() {
}

public static Model instance() {
    if (__instance == null) {
        __instance = new Model();
    }
    return __instance;
}

private Object mydataToShare = null;

public void setMyDataToShare(Object mydataToShare) {
    this.mydataToShare = mydataToShare; 
}

public Object getMyDataToShare() {
    return mydataToShare;
}

}

存储数据:

Model.instance().setMyDataToShare(<value to store>);

检索数据:

Object valueToRetrieve = Model.instance().getMyDataToShare();

它允许您传输复杂的数据并将逻辑部分与 UI 完全分离

【讨论】:

    猜你喜欢
    • 2015-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多