2015-03-08 3 views
-1

Я пытаюсь получить строку для отображения из strings.xmlПолучение NULL значения из strings.xml ресурса

opmStatusText показывает правильное значение от strings.xml (Android Студия отображается значение), но когда я используйте его в txt = «Operational Status:» + opmStatusText; он показывает, как NULL

в моем приложении я получаю: эксплуатационное состояние: нулевой

Что я делаю неправильно?

Вот весь класс

package com.myapp.opm_status; 

import android.content.Context; 

import org.json.JSONException; 
import org.json.JSONObject; 

public class OPMStatus { 
    public MainActivity.Status status; 
    public String appliesto; 
    public String location; 
    public String txt; 

    private static String opmStatusText; 

    public static String getString(Context context) { 

     opmStatusText = context.getResources().getString(R.string.statusTxt); 

     return opmStatusText; 
    } 

    public OPMStatus(JSONObject obj) { 
     try { 
      this.appliesto = obj.getString("AppliesTo"); 
      this.location = obj.getString("Location"); 
      this.txt = obj.getString("ShortStatusMessage"); 
      String iconText = obj.getString("Icon"); 
      switch (iconText) { 
       case "Unknown": 
        this.status = MainActivity.Status.Unknown; 
        break; 
       case "Open": 
        this.status = MainActivity.Status.Open; 
        break; 
       case "Alert": 
        this.status = MainActivity.Status.Alert; 
        break; 
       default: 
        this.status = MainActivity.Status.Closed; 
      } 
     } catch (JSONException e) { 
      e.printStackTrace(); 
      //txt = "Operational Status Unknown: Please ensure you have a connection to the Internet and then press Refresh to try again."; 
      txt = "Operational Status: " + opmStatusText; 
      this.status = MainActivity.Status.Unknown; 
     } 
    } 
} 

Мой MainActivity

package com.myapp.opm_status; 

import android.app.AlarmManager; 
import android.app.NotificationManager; 
import android.app.PendingIntent; 
import android.content.Context; 
import android.content.Intent; 
import android.content.SharedPreferences; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.os.SystemClock; 
import android.preference.PreferenceManager; 
import android.support.v7.app.ActionBarActivity; 
import android.util.Log; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.widget.Button; 
import android.widget.ImageView; 
import android.widget.TextView; 

import java.text.DateFormat; 
import java.text.SimpleDateFormat; 
import java.util.Date; 

public class MainActivity extends ActionBarActivity { 

    public static final String STATUS_URL = "http://www.wwopm.gov/json/operatingstatus.json"; //Entered wrong URL to get an unknown status for testing 
    public static final int NOTIFICATION_ID = 493812; 
    private static final String DEFAULT_POLLING_INTERVAL = "1"; 

    // Static form for access from broadcast receiver 
    public static int getPersistentUpdateIntervalMins(Context ctx) { 
     SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(ctx); 
     String minsStr = prefs.getString("updateIntervalMins", DEFAULT_POLLING_INTERVAL); 
     return Integer.parseInt(minsStr); 
    } 

    ; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     getSupportActionBar().setHomeButtonEnabled(true); 
     getSupportActionBar().setDisplayShowHomeEnabled(true); 
     getSupportActionBar().setIcon(R.drawable.ic_launcher); 
     listenRefresh(); 
    } 

    @Override 
    public void onResume() { 
     super.onResume(); 
     refreshStatus(); 
     // Wipe status of notification 
     NotificationManager mNotificationManager = 
       (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); 
     mNotificationManager.cancel(NOTIFICATION_ID); 

     int minutes = getPersistentUpdateIntervalMins(); 
     Log.d("MainActivity", "Update interval is " + minutes); 
     AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE); 
     Intent i = new Intent(this, NotificationService.class); 
     PendingIntent pi = PendingIntent.getService(this, 0, i, 0); 
     am.cancel(pi); 
     // by my own convention, minutes <= 0 means notifications are disabled 
     if (minutes > 0) { 
      am.setInexactRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, 
        SystemClock.elapsedRealtime() + minutes * 60 * 1000, 
        minutes * 60 * 1000, pi); 
     } 
    } 

    @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) { 
      Intent intentSetPref = new Intent(getApplicationContext(), PrefActivity.class); 
      startActivityForResult(intentSetPref, 0); 
     } 

     return super.onOptionsItemSelected(item); 
    } 

    // Executes a rest call to the url and updates visuals as well as persisted status 
    void refreshStatus() { 
     Log.d("MainActivity", "About to execute refresh"); 

     AsyncTask task = new AsyncTask() { 
      @Override 
      protected OPMStatus doInBackground(Object[] params) { 
       return new OPMStatus(SyncRestClient.connect()); 
      } 

      @Override 
      protected void onPostExecute(final Object obj) { 
       runOnUiThread(new Runnable() { 
        @Override 
        public void run() { 
         OPMStatus opms = (OPMStatus) obj; 
         setStatusTextLocation(opms.location); 
         setStatusTextAppliesTo(opms.appliesto); 
         setStatusTextPersistent(opms.txt); 
         setStatusImage(opms.status); 
         setStatusText(opms.location, opms.appliesto, opms.txt, opms.status); 
        } 
       }); 
      } 
     }; 
     task.execute(); 
    } 


    // Attach a listener to the refresh button 
    private void listenRefresh() { 
     Button refreshButton = (Button) findViewById(R.id.refreshButton); 
     refreshButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       refreshStatus(); 
      } 
     }); 
    } 

    // Set shared preferences status location 
    void setStatusTextLocation(String location) { 
     SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); 
     SharedPreferences.Editor editor = prefs.edit(); 
     editor.putString("statusLocation", location); 
     editor.apply(); 
    } 

    // Set shared preferences status Applies To 
    void setStatusTextAppliesTo(String appliesto) { 
     SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); 
     SharedPreferences.Editor editor = prefs.edit(); 
     editor.putString("statusAppliesTo", appliesto); 
     editor.apply(); 
    } 

    // Set shared preferences status text 
    void setStatusTextPersistent(String txt) { 
     SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); 
     SharedPreferences.Editor editor = prefs.edit(); 
     editor.putString("statusText", txt); 
     editor.apply(); 
    } 

    // Get shared preferences update interval in minutes 
    int getPersistentUpdateIntervalMins() { 
     SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); 
     String minsStr = prefs.getString("updateIntervalMins", DEFAULT_POLLING_INTERVAL); 
     return Integer.parseInt(minsStr); 
    } 

    // This function sets the text of the textviews 
    private void setStatusText(String location, String appliesto, String txt, Status status) { 
     //TextView statusTitle = (TextView) findViewById(R.id.statusTitle); 
     TextView statusLocation = (TextView) findViewById(R.id.statusLocation); 
     TextView statusAppliesTo = (TextView) findViewById(R.id.statusAppliesToTxt); 
     TextView statusText = (TextView) findViewById(R.id.statusText); 
     statusLocation.setText(location); 
     statusAppliesTo.setText(" " + appliesto); 
     statusText.setText(txt); 
     TextView timeText = (TextView) findViewById(R.id.currentTime); 
     TextView statusPhrase = (TextView) findViewById(R.id.statusPhrase); 

     DateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy hh:mm:ss a"); 
     Date date = new Date(); 
     timeText.setText(" " + dateFormat.format(date)); 
     switch (status) { 
      case Unknown: 
       statusPhrase.setTextColor(getResources().getColor(android.R.color.holo_blue_light)); 
       break; 
      case Open: 
       statusPhrase.setTextColor(getResources().getColor(android.R.color.holo_green_dark)); 
       break; 
      case Alert: 
       statusPhrase.setTextColor(getResources().getColor(android.R.color.holo_orange_light)); 
       break; 
      default: 
       statusPhrase.setTextColor(getResources().getColor(android.R.color.holo_red_dark)); 
     } 
     Log.d("Debug", status.toString()); 
     statusPhrase.setText(getString(R.string.status) + " " + status.toString()); 

    } 

    // This function will set the icon based on the current status 
    private void setStatusImage(Status s) { 
     ImageView statusImage = (ImageView) findViewById(R.id.statusImage); 
     int resId; 
     switch (s) { 
      case Unknown: 
       resId = R.drawable.status_unknown; 
       break; 
      case Open: 
       resId = R.drawable.status_open; 
       break; 
      case Alert: 
       resId = R.drawable.status_alert; 
       break; 
      default: 
       resId = R.drawable.status_closed; 
     } 
     statusImage.setImageResource(resId); 
    } 

    public enum Status {Unknown, Open, Alert, Closed} 
} 
+0

Если вы понизили мой вопрос, пожалуйста, скажите мне, почему. Я уже обыскал, и вот как я оказался там, где я нахожусь. Я почти работаю, но это неправильно. – Sobo

+1

Где вы вызываете свой статический метод getString()? Должен ли String opmStatusText быть статическим? –

+0

Я пытаюсь удержать от жесткого кодирования что-нибудь и пытаюсь получить значение из Strings.xml. Сначала я попробовал «txt = Resources.getSystem(). GetString (android.R.string.statusTxt)», но это тоже не сработало. Так что я нашел, что он сказал, что должен иметь контекст, поэтому я добавил публичную статическую String getString (контекст контекста). Надеюсь, это объяснит это. – Sobo

ответ

1

Измените свой конструктор общественного OPMStatus (JSONObject объект) быть:

public OPMStatus(JSONObject obj, Context context) 
{ 
    Context thisContext = context; 
     ... ... 

    catch (JSONException e) { 
     e.printStackTrace(); 
     //txt = "Operational Status Unknown: Please ensure you have a connection to the Internet and then press Refresh to try again."; 
     txt = "Operational Status: " + getString(thisContext); 
     this.status = MainActivity.Status.Unknown; 
    } 

} 

изменить ваш doInBackground как:

@Override 
protected JSONObject doInBackground(Object[] params) { 
      return SyncRestClient.connect(); 
} 

@Override 
protected void onPostExecute(JSONObject jsonObj) { 

     OPMStatus opms = OPMStatus(jsonObj, this);   

     setStatusTextLocation(opms.location); 
     setStatusTextAppliesTo(opms.appliesto); 
     setStatusTextPersistent(opms.txt); 
     setStatusImage(opms.status); 
     setStatusText(opms.location, opms.appliesto, opms.txt, opms.status); 
} 
+0

Когда я попробовал это, моя MainActivity получила ошибку, которую OPMStatus не может применить к JSONObject. Я добавила мою MainActivity для дополнительной справки. – Sobo

+1

В вашей 'MainActivity' вы должны называть' OPMStatus (yourJson, this) ', правильно? – Xcihnegn

+0

@ Собо сейчас работает? – Xcihnegn

0

Это сделало меня тем, что я хотел.

package com.myapp.opm_status; 

import android.content.Context; 

import org.json.JSONException; 
import org.json.JSONObject; 

import static com.myapp.opm_status.R.string.statusTxt; 

public class OPMStatus { 
    public MainActivity.Status status; 
    public String appliesto; 
    public String location; 
    public String txt; 

    public String opmStatusText; 

    public OPMStatus(Context context) { 
     opmStatusText = context.getString(statusTxt); 
    } 

    public OPMStatus(JSONObject obj) { 

     try { 
      this.appliesto = obj.getString("AppliesTo"); 
      this.location = obj.getString("Location"); 
      this.txt = obj.getString("ShortStatusMessage"); 
      String iconText = obj.getString("Icon"); 
      switch (iconText) { 
       case "Unknown": 
        this.status = MainActivity.Status.Unknown; 
        break; 
       case "Open": 
        this.status = MainActivity.Status.Open; 
        break; 
       case "Alert": 
        this.status = MainActivity.Status.Alert; 
        break; 
       default: 
        this.status = MainActivity.Status.Closed; 
      } 
     } catch (JSONException e) { 
      e.printStackTrace(); 
      txt = "" + new OPMStatus(obj); 
      this.status = MainActivity.Status.Unknown; 
     } 
    } 

} 
Смежные вопросы