2016-01-01 32 views
2

我正在創建一個天氣小工具。第一次將小工具拖到主屏幕時,配置屏幕應該出現三個代表三個城市的按鈕。當用戶點擊一個按鈕(比如哥本哈根)時,我希望字符串「哥本哈根」被轉移到Widget本身,所以它可以去Fetech天氣哥本哈根的數據並將其顯示給用戶。是什麼?將小部件配置屏幕中的字符串傳輸到AppWidget本身?

AppWidget配置屏幕

Configuration screen

構件屏幕

Widget screen

回答

0

我會解釋它使用SharedPreferences的解決方案。

  1. 您確實需要兩個java文件。一個App Widget配置活動(我稱之爲配置)和一個AppWidgetProvider(我稱之爲WeatherWidget)。您將需要兩個xml文件,定義配置活動和小部件(我稱之爲我的activity_configure.xml和weather_widget.xml)的佈局。

  2. 您將需要一個清單文件,也是一個小部件信息文件(IVE打電話給我weather_widget_info

enter image description here

下面是從配置

public class Configure extends AppCompatActivity { 
    private int widgetID; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_configure); 

    // if the user hits back button 
    setResult(RESULT_CANCELED); 

    // get widgetID for this widget instance 
    Bundle extras = getIntent().getExtras(); 
    if (extras != null) { 
     widgetID = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID); 
    } 

    Button copenhagenButton = (Button) findViewById(R.id.copenhagenButton); 
    copenhagenButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      saveData("Copenhagen"); 
      resultOK(); 
     } 
    }); 

    Button stockholmButton = (Button) findViewById(R.id.stockholmButton); 
    stockholmButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      saveData("Stockholm"); 
      resultOK(); 
     } 
    }); 

    Button osloButton = (Button) findViewById(R.id.osloButton); 
    osloButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      saveData("Oslo"); 
      resultOK(); 
     } 
    }); 

} 

private void saveData(String cityName) { 
    String widgetIDString = Integer.toString(widgetID); 
    SharedPreferences prefs = this.getSharedPreferences(widgetIDString, Context.MODE_PRIVATE); 
    SharedPreferences.Editor edit = prefs.edit(); 
    edit.putString("city", cityName); 
    edit.commit(); 
} 

private void resultOK() { 

    // send an onUpdate() message to the widget via a broadcast 
    Intent intent = new Intent(AppWidgetManager.ACTION_APPWIDGET_UPDATE, null, this, WeatherWidget.class); 
    intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, new int[]{widgetID}); 
    sendBroadcast(intent); 

    // signal OK 
    Intent resultValue = new Intent(); 
    resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, widgetID); 
    setResult(RESULT_OK, resultValue); 
    finish(); 
} 

相關的代碼}

這裏是相關的公司德從WeatherWidget

public class WeatherWidget extends AppWidgetProvider { 
final static String TAG = "stille"; 
private int widgetID; 
private String city="N/A"; 
RemoteViews views; 

@Override 
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { 
    // There may be multiple widgets active, so update all of them 
    final int N = appWidgetIds.length; 
    for (int i = 0; i < N; i++) { 
     widgetID = appWidgetIds[i]; 
     loadCity(context); 
     views = new RemoteViews(context.getPackageName(), R.layout.weather_widget); 
     views.setTextViewText(R.id.location, city); 
     appWidgetManager.updateAppWidget(widgetID, views); 
    } 
} 

private void loadCity(Context context) { 
    String widgetIDString = Integer.toString(widgetID); 
    SharedPreferences prefs = context.getSharedPreferences(widgetIDString, Context.MODE_PRIVATE); 
    String cityName = prefs.getString("city", "N/A "); 
    city = cityName; 
} 

}

相關問題