【问题标题】:Phone Book on androidAndroid上的电话簿
【发布时间】:2016-07-21 23:03:15
【问题描述】:

这是我的第一个问题。对不起愚蠢。 我的任务是在 android 上创建一个电话簿。我很生气,很沮丧,很生气,因为我不知道该怎么做。

所以我决定一开始做一个非常简单的应用程序。

假设,我有 mainActivity。那里有一个 EditText,我输入一些字符串。然后我按下一个按钮,看到 Activity 2。我按下一个按钮回到 mainActivity,我想看到代表之前输入的字符串的 TextView。 问题是字符串为空(( 在 mainActivity 暂停我的变量之前,我的变量没有保存? 我怎样才能保存它们?

Contact Book 应用也有同样的想法。我创建新联系人,将其传递给意图,返回 MainActivity,但联系人的 ArrayList 只有新联系人。其余数据丢失(

主要活动:

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    TextView txtsavedValue;
    EditText edtInput;
    Button btnTo2;
    String string, str;
    int integer1;
    String LOG_TAG = MainActivity.class.getSimpleName();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                .setAction("Action", null).show();
            }
        });
        btnTo2 = (Button) findViewById(R.id.btnSendTo2);
        btnTo2.setOnClickListener(this);
        txtsavedValue = (TextView) findViewById(R.id.txtSavedValue);
        edtInput = (EditText) findViewById(R.id.editTextInput);
        if (savedInstanceState != null) {
            string = savedInstanceState.getString("mykey");
            Log.v(LOG_TAG, string);
            txtsavedValue.setText(string);
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

    @Override
    public void onClick(View view) {
        string = (edtInput.getText().toString());
        Log.v(LOG_TAG, string);
        Intent intent = new Intent(this, Main2Activity.class);
        startActivity(intent);
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        outState.putString("mykey", string);
        super.onSaveInstanceState(outState);


    }

    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);

        Log.v(LOG_TAG, "truuue");
        string = savedInstanceState.getString("mykey");
        txtsavedValue.setText(string);



    }

    @Override
    protected void onResume() {
        super.onResume();
        if (string != null) {
            Log.v(LOG_TAG, string);
            txtsavedValue.setText(string);
        } else Log.v(LOG_TAG, "nulll");


    }
}

Main2Activity:

public class Main2Activity extends AppCompatActivity implements View.OnClickListener {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main2);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
    fab.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                    .setAction("Action", null).show();
        }
    });
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    Button b = (Button) findViewById(R.id.btnTo1);
    b.setOnClickListener(this);
}

@Override
public void onClick(View view) {
    Intent intent = new Intent(this, MainActivity.class);
    startActivity(intent);
}

}

【问题讨论】:

  • 您可能应该更清楚地编码。尤其是日志,让日志为您工作,并让它们为您提供有用的信息,以识别代码是如何流动的。

标签: java android


【解决方案1】:

按下按钮时,将 EditText 中的字符串保存到 SharedPreference。这样,您可以通过使用该键调用相同的 SharedPreference 从任何 Activity 中检索该字符串。

A quick example to Shared Preference

【讨论】:

    【解决方案2】:

    您可以尝试将第二行添加到清单中的活动中

    <activity android:name=".MainActivity"
              android:launchMode= "singleInstance" >
    

    参考:https://stackoverflow.com/a/5784950/399741

    onSaveInstanceState 可能不会在 onPause 或 onStop 之后立即被调用(这些方法分别在您的 Activity 失去焦点或不可见时被调用),因为它在 Activity 即将被销毁时被调用。 Android 通常会在 Activity 仍然存在时保留您的实例变量,但只是暂停或停止。

    但是,Android 可能会创建一个新的 Activity 实例,以便在您导航回该 Activity 堆栈时将其置于其顶部,从而使您的字符串为空。您可以使用上面的代码来防止这种情况,确保使用相同的实例直到它被销毁。

    编辑:可能是您的讲师只是希望您练习在活动之间来回传递信息:您可以将字符串传递给意图包中的 Activity2,然后在返回 Activity1 时再次执行,重置通过获取意图的捆绑包在 onCreate 中的字符串。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多