简体   繁体   中英

Android Studio TextView.text does not update

I modified MyFirstApp slightly. I turned it into a handy, simple app that takes miles travelled and fuel taken and after pressing a button, starts new activity, which displays fuel usage in litres/100km.

The problem I'm facing is that the output always shows 62,14 l/100km, no matter what values are entered before button click. I'm guessing that it is the result of very first calculation, which is not updating.

strings.xml:

<resources>
    <string name="app_name">FuelEcoCalc</string>
    <string name="action_settings">Settings</string>
    <string name="edit_miles">Distance in miles</string>
    <string name="edit_litres">Fuel qty in litres</string>
    <string name="button_calculate">Calculate</string>
    <string name="title_activity_main">MainActivity</string>
    <string name="title_activity_display_message">My Message</string>
    <string name="hello_world">Hello World</string>
</resources>

menu_display_message.xml:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context="com.example.wojtek.myfirstapp.DisplayMessageActivity">
    <item android:id="@+id/action_settings" android:title="@string/action_settings"
    android:orderInCategory="100" app:showAsAction="never" />
</menu>

menu_my.xml:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools" tools:context=".MyActivity">
    <item android:id="@+id/action_settings" android:title="@string/action_settings"
    android:orderInCategory="100" app:showAsAction="never" />
</menu>

activity_my.xml:

<LinearLayout 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:orientation="vertical">
    <EditText
        android:id="@+id/edit_miles"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="@string/edit_miles">
    </EditText>
    <EditText
        android:id="@+id/edit_litres"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="@string/edit_litres">
    </EditText>
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/button_calculate"
        android:onClick="sendMessage">
    </Button>
</LinearLayout>

activity_display_message.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="com.example.wojtek.myfirstapp.DisplayMessageActivity">

    <TextView android:text="@string/title_activity_display_message" android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
</RelativeLayout>

MyActivity.java:

import android.content.Intent;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.EditText;

public class MyActivity extends ActionBarActivity {

    public final static String MILES_MESSAGE = "com.mycompany.myfirstapp.MESSAGE";
    public final static String FUEL_MESSAGE = "com.mycompany.myfirstapp.MESSAGE";


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

    @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_my, 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);
    }

    /** Called when the user clicks the Send button */
    public void sendMessage(View view) {
        Intent intent = new Intent(this, DisplayMessageActivity.class);
        EditText editMiles = (EditText) findViewById(R.id.edit_miles);
        String miles = editMiles.getText().toString();
        EditText editFuel = (EditText) findViewById(R.id.edit_litres);
        String fuel = editFuel.getText().toString();
        intent.removeExtra(MILES_MESSAGE);
        intent.removeExtra(FUEL_MESSAGE);
        intent.putExtra(MILES_MESSAGE, miles);
        intent.putExtra(FUEL_MESSAGE, fuel);
        startActivity(intent);
    }
}

DisplayMessageActivity.java:

import android.content.Intent;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.MenuItem;
import android.widget.TextView;
import java.text.DecimalFormat;

public class DisplayMessageActivity extends ActionBarActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Intent intent = getIntent();
        String miles = intent.getStringExtra(MyActivity.MILES_MESSAGE);
        String fuel = intent.getStringExtra(MyActivity.FUEL_MESSAGE);
        TextView textView = new TextView(this);
        textView.setTextSize(40);
        String message = "";
        try {
            double milesTravelled = Double.parseDouble(miles);
            double fuelTaken = Double.parseDouble(fuel);
            double mileToKm = 1.609344;
            double kmTravelled = milesTravelled * mileToKm;
            double fuelUsagePer100Km = (fuelTaken * 100) / kmTravelled;
            DecimalFormat df = new DecimalFormat("#.##");
            String output = df.format(fuelUsagePer100Km).toString();
            message = output + " litres/100km";
        } catch (Exception e) {
            message = "Invalid input";
        }
        textView.setText(message);
        setContentView(textView);
    }


    @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);
    }
}

AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.wojtek.myfirstapp" >

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MyActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".DisplayMessageActivity"
            android:label="@string/title_activity_display_message"
        android:parentActivityName="com.example.wojtek.myfirstapp.MyActivity" >
            <meta-data
                android:name="android.support.PARENT_ACTIVITY"
                android:value="com.example.wojtek.myfirstapp.MyActivity" />
        </activity>
    </application>
</manifest>

Your help will be greatly appreciated.

EDIT: I think I should also add the log... This appears when I click the button:

05-09 05:54:12.917    2106-2141/com.example.wojtek.myfirstapp W/EGL_emulation﹕ eglSurfaceAttrib not implemented
05-09 05:54:12.917    2106-2141/com.example.wojtek.myfirstapp W/OpenGLRenderer﹕ Failed to set EGL_SWAP_BEHAVIOR on surface 0xa64ae220, error=EGL_SUCCESS

Maybe it's because in DisplayMessageActivity.java, you aren't getting a reference to the TextView in your layout

TextView textView = (TextView)findViewById(R.id.textView);

You also need to provide an id to your TextView in your layout file.

<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="com.example.wojtek.myfirstapp.DisplayMessageActivity">

<TextView android:id="@+id/textView" android:text="@string/title_activity_display_message" android:layout_width="wrap_content"
    android:layout_height="wrap_content" />

EDIT: I figured out what your problem was. You don't need to do anything else. In your MyActivity.java, you have set both string constants to the same value. Make them different. For example:

public final static String MILES_MESSAGE = "com.mycompany.myfirstapp.MESSAGEMILES";
public final static String FUEL_MESSAGE = "com.mycompany.myfirstapp.MESSAGEFUEL";

Hope it works for you now.

try to debug that ,are you getting different values in String miles,String fuel? every time you go to display activity .. and i think you should use textview by its id

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM