2014-02-21 27 views
1

我正在使用JSON。我寫了可以加載JSON(圖像和文本)並在ListView中顯示數據的代碼(在ListView的OnItemClickListener中,我開始了新的Activity)。Android小部件開始與putextra的新活動

我還寫了一個appwidget(stackview widget),我可以在堆棧視圖窗口小部件中顯示JSON內容,例如,如果我單擊第5項,它會啓動一個新的活動並允許用戶閱讀第5條新聞。我可以在小部件點擊上啓動新的活動,但是我如何根據項目位置啓動新的結果活動?

這是我的代碼:

public class MainActivity extends Activity { 
public String URL = "*********************"; 

public static String KEY_title = "title"; 
public static String KEY_description = "description"; 
public static String KEY_image = "image"; 
public static String KEY_journal = "journal"; 
public static String KEY_JournalID = "JournalID"; 
public static String KEY_pubDate = "pubDate"; 
public static String KEY_statID = "statID"; 
public JSONArray jsonarray; 
public ListView list; 
public JSONParser jsonparser; 
static BRIgeAdapter adapter; 

public static ArrayList<HashMap<String, String>> itemList; 

public static String dateTime; 
private ArrayList<Content> contents = new ArrayList<Content>(); 

public TransparentProgressDialog pd; 
HashMap<String, String> map; 

private int screenSize; 

public LoadDataAllChanelsToServer loadData; 

public TextView journal, tittle, description, smalllink, DateTime, 
     smallstatID; 

@SuppressLint("CutPasteId") 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    requestWindowFeature(Window.FEATURE_NO_TITLE); 
    setContentView(R.layout.main); 
    screenSize = getResources().getConfiguration().screenLayout 
      & Configuration.SCREENLAYOUT_SIZE_MASK; 

    itemList = new ArrayList<HashMap<String, String>>(); 
    list = (ListView) findViewById(R.id.listView1); 

    adapter = new BRIgeAdapter(MainActivity.this, itemList, screenSize); 

    Thread.setDefaultUncaughtExceptionHandler(new UnCaughtException(this, 
      this)); 
    loadData = new LoadDataAllChanelsToServer(); 

    pd = new TransparentProgressDialog(this, R.drawable.loader); 


    list.setOnItemClickListener(new OnItemClickListener() { 

     @Override 
     public void onItemClick(AdapterView<?> parent, View view, 
       int position, long id) { 
      journal = (TextView) view.findViewById(R.id.smalljournal); 

      tittle = (TextView) view.findViewById(R.id.smalltitle); 
      description = (TextView) view 
        .findViewById(R.id.smallDescription); 
      smalllink = (TextView) view.findViewById(R.id.smalllink); 
      DateTime = (TextView) view.findViewById(R.id.smallDateTime); 
      smallstatID = (TextView) view.findViewById(R.id.smallstatID); 
      String Stringjournal = journal.getText().toString(); 
      String Stringtittle = tittle.getText().toString(); 
      String Stringdescription = description.getText().toString(); 
      String Stringlink = smalllink.getText().toString(); 
      String StringdateTime = DateTime.getText().toString(); 
      String StringstatID = smallstatID.getText().toString(); 

      Intent in = new Intent(MainActivity.this, Result.class); 
      in.putExtra("KEY_journal", Stringjournal); 
      in.putExtra("KEY_title", Stringtittle); 
      in.putExtra("KEY_description", Stringdescription); 
      in.putExtra("KEY_link", Stringlink); 
      in.putExtra("KEY_pubDate", StringdateTime); 
      in.putExtra("KEY_statID", StringstatID); 

      String url = itemList.get(position).get(MainActivity.KEY_image); 

      if (url.endsWith("-c.jpg")) 
       url = url.replace("-c.jpg", ".jpg"); 
      in.putExtra("Bitmap", url); 

      in.putExtra("Bitmap", url); 

      startActivity(in); 
      overridePendingTransition(R.anim.trans_left_in, 
        R.anim.trans_left_out); 

     } 
    }); 

    loadData.execute(); 

} 

private class LoadDataAllChanelsToServer extends 
     AsyncTask<String, Integer, String> { 

    @Override 
    protected void onPreExecute() { 

     pd.show(); 
    } 

    @Override 
    protected String doInBackground(String... urls) { 

     jsonparser = new JSONParser(); 

     JSONObject jsonobject = jsonparser.getJSONfromURL(URL); 
     try { 

      jsonarray = jsonobject.getJSONArray("data"); 

      for (int i = 0; i < jsonarray.length(); i++) { 
       jsonobject = jsonarray.getJSONObject(i); 

       map = new HashMap<String, String>(); 

       map.put("journal", jsonobject.getString(KEY_journal)); 
       map.put("image", jsonobject.getString(KEY_image)); 
       map.put("title", jsonobject.getString(KEY_title)); 
       map.put("description", 
         jsonobject.getString(KEY_description)); 
       map.put("JournalID", jsonobject.getString(KEY_JournalID)); 
       map.put("pubDate", jsonobject.getString(KEY_pubDate)); 
       map.put("statID", jsonobject.getString(KEY_statID)); 

       Content cont = new Content(jsonobject.getString("journal"), 
         jsonobject.getString("image"), 
         jsonobject.getString("title"), 
         jsonobject.getString("pubDate"), 
         jsonobject.getString("description"), 
         jsonobject.getString("JournalID"), 
         jsonobject.getString("statID")); 
       contents.add(cont); 

       itemList.add(map); 
       dateTime = itemList.get(itemList.size() - 1).get(
         KEY_pubDate); 
      } 

     } catch (JSONException e) { 
      Log.e("Error", e.getMessage()); 
      e.printStackTrace(); 
     } 

     return itemList.toString(); 

    } 

    @Override 
    protected void onPostExecute(String result) { 
     try { 
      if (pd != null) { 
       pd.dismiss(); 

      } 
     } catch (Exception e) { 

     } 

     try { 
      adapter = new BRIgeAdapter(MainActivity.this, itemList, 
        screenSize); 
      list.setAdapter(adapter); 

     } catch (NullPointerException e) { 
      e.printStackTrace(); 
     } 

    } 

} 

} 

Result.java代碼

public class Result extends Activity { 

public Drawable mDrawable; 
ImageLoader loader;; 
public MainActivity main; 

Bundle parems; 

public TextView tittle, desc, statID, journal, DateTime; 

public String My_tittle, My_desc, My_link, My_statID, StringmBitmap, 
     My_journal, My_dateTime, position; 
public ImageView image; 
public ScrollView scrollview; 

AlertDialogManager alert = new AlertDialogManager(); 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    requestWindowFeature(Window.FEATURE_NO_TITLE); 

    setContentView(R.layout.activity_result); 

    statID = (TextView) findViewById(R.id.statID); 
    journal = (TextView) findViewById(R.id.DateTimeDetails); 
    DateTime = (TextView) findViewById(R.id.Tabula); 
    scrollview = (ScrollView) findViewById(R.id.scrollviewMenu); 

    loader = new ImageLoader(this); 
    tittle = (TextView) findViewById(R.id.titleDetails); 
    desc = (TextView) findViewById(R.id.descriptionDetails); 

    image = (ImageView) findViewById(R.id.imageDetails); 

    Intent intent = getIntent(); 

    My_tittle = intent.getStringExtra("KEY_title"); 
    My_desc = intent.getStringExtra("KEY_description"); 
    My_link = intent.getStringExtra("KEY_link"); 
    My_statID = intent.getStringExtra("KEY_statID"); 
    My_journal = intent.getStringExtra("KEY_journal"); 
    My_dateTime = intent.getStringExtra("KEY_pubDate"); 
    position = intent.getStringExtra("position"); 

    StringmBitmap = intent.getStringExtra("Bitmap"); 



    loader.DisplayImage(StringmBitmap, image); 

    Log.d("url", StringmBitmap); 
    tittle.setText(My_tittle); 
    DateTime.setText(My_dateTime); 

    My_desc = My_desc.trim(); 
    My_desc = My_desc.replaceAll("\n", "\n\n"); 

    Log.i("JSOOOOOOOOOOOOOOONNNNNNN", My_desc); 
    desc.setText(My_desc); 

    statID.setText(My_statID); 
    journal.setText(My_journal); 

} 

} 

BaseAdapter Java代碼

public class BRIgeAdapter extends BaseAdapter { 

Context mContext; 
private ArrayList<HashMap<String, String>> data; 
private static LayoutInflater inflater = null; 
public ImageLoader imageLoader; 

private int screenSize; 

public BRIgeAdapter(Context context, ArrayList<HashMap<String, String>> d, 
     int screenSize) { 
    this.mContext = context; 
    this.data = d; 
    this.screenSize = screenSize; 
    inflater = (LayoutInflater) mContext 
      .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    imageLoader = new ImageLoader(context.getApplicationContext()); 
} 

public int getCount() { 
    return data.size(); 
} 

public Object getItem(int position) { 
    return position; 
} 

public long getItemId(int position) { 
    return position; 
} 

public View getView(int position, View convertView, ViewGroup parent) { 
    View vi = convertView; 
    if (convertView == null) 
     vi = inflater.inflate(R.layout.list_row, null); 

    TextView journal = (TextView) vi.findViewById(R.id.smalljournal); 
    TextView title = (TextView) vi.findViewById(R.id.smalltitle); 
    TextView description = (TextView) vi 
      .findViewById(R.id.smallDescription); 
    ImageView thumb_image = (ImageView) vi.findViewById(R.id.smallthumb); 
    TextView statId = (TextView) vi.findViewById(R.id.smallstatID); 
    TextView DateTime = (TextView) vi.findViewById(R.id.smallDateTime); 
    HashMap<String, String> itemList = new HashMap<String, String>(); 
    itemList = data.get(position); 

    journal.setText(itemList.get(MainActivity.KEY_journal)); 
    statId.setText(itemList.get(MainActivity.KEY_statID)); 


    String titleString = itemList.get(MainActivity.KEY_title); 

    SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd"); 

    String DateTimeTxt = itemList.get(MainActivity.KEY_pubDate).replace(
      "T", " "); 

    try { 
     Date _d = df.parse(DateTimeTxt); 
     SimpleDateFormat new_df = new SimpleDateFormat("dd.MM.yyyy"); 
     String _s = new_df.format(_d); 
     DateTime.setText(_s); 
    } catch (ParseException e) { 

     e.printStackTrace(); 
    } 

    if (screenSize == Configuration.SCREENLAYOUT_SIZE_NORMAL) 
     description.setVisibility(View.INVISIBLE); 

    else 
     description.setVisibility(View.VISIBLE); 
    title.setText(titleString); 

    description.setText(itemList.get(MainActivity.KEY_description)); 


    String url = itemList.get(MainActivity.KEY_image); 

    imageLoader.DisplayImage(url, thumb_image); 

    return vi; 
} 

} 

的AppWidgetProvider java的鱈魚Ë

public class BriGeWidgetProvider extends AppWidgetProvider { 
public static final String TOAST_ACTION = "com.example.android.stackwidget.TOAST_ACTION"; 
public static final String EXTRA_ITEM = "com.example.android.stackwidget.EXTRA_ITEM"; 
private RemoteViews views; 
private Intent intent; 

@Override 
public void onDeleted(Context context, int[] appWidgetIds) { 
    super.onDeleted(context, appWidgetIds); 
} 

@Override 
public void onDisabled(Context context) { 
    super.onDisabled(context); 
} 

@Override 
public void onEnabled(Context context) { 
    super.onEnabled(context); 
} 

@Override 
public void onReceive(Context context, Intent intent) { 
    AppWidgetManager mgr = AppWidgetManager.getInstance(context); 
    if (intent.getAction().equals(TOAST_ACTION)) { 
     int appWidgetId = intent.getIntExtra(
       AppWidgetManager.EXTRA_APPWIDGET_ID, 
       AppWidgetManager.INVALID_APPWIDGET_ID); 

     int viewIndex = intent.getIntExtra(EXTRA_ITEM, 0); 
     Toast.makeText(context, "Touched view " + viewIndex, 
       Toast.LENGTH_SHORT).show(); 

     context.startActivity(new Intent(context, MainActivity.class) 
       .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)); 

    } 
    super.onReceive(context, intent); 
} 

@SuppressWarnings("deprecation") 
@Override 
public void onUpdate(Context context, AppWidgetManager appWidgetManager, 
     int[] appWidgetIds) { 

    final int N = appWidgetIds.length; 
    for (int i = 0; i < N; i++) { 
     int appWidgetId = appWidgetIds[i]; 

     intent = new Intent(context, BriGeRemoteViewsService.class); 

     intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); 

     views = new RemoteViews(context.getPackageName(), 
       R.layout.widget_layout); 
     views.setRemoteAdapter(appWidgetId, R.id.stackWidgetView, intent); 

     views.setEmptyView(R.id.stackWidgetView, R.id.stackWidgetEmptyView); 

     Intent templateIntent = new Intent(context, 
       BriGeWidgetProvider.class); 
     templateIntent.setAction(BriGeWidgetProvider.TOAST_ACTION); 
     templateIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, 
       appWidgetId); 
     intent.setData(Uri.parse(intent.toUri(Intent.URI_INTENT_SCHEME))); 
     PendingIntent templatePendingIntent = PendingIntent.getBroadcast(
       context, 0, templateIntent, 
       PendingIntent.FLAG_UPDATE_CURRENT); 
     views.setPendingIntentTemplate(R.id.stackWidgetView, 
       templatePendingIntent); 

     appWidgetManager.updateAppWidget(appWidgetId, views); 
    } 
    super.onUpdate(context, appWidgetManager, appWidgetIds); 
} 
} 

RemoteViewsService Java代碼

public class BriGeRemoteViewsService extends RemoteViewsService { 
@Override 
public RemoteViewsFactory onGetViewFactory(Intent intent) { 

    return new BriGeRemoteViewsFactory(this.getApplicationContext(), intent); 
} 

class BriGeRemoteViewsFactory implements RemoteViewsFactory { 

    private ArrayList<ItemI> itemList; 
    private Context context; 
    private int appWidgetId; 

    public BriGeRemoteViewsFactory(Context context, Intent intent) { 
     this.context = context; 
     this.appWidgetId = intent.getIntExtra(
       AppWidgetManager.EXTRA_APPWIDGET_ID, 
       AppWidgetManager.INVALID_APPWIDGET_ID); 
    } 

    @Override 
    public void onCreate() { 
     itemList = getData(); 
    } 

    @Override 
    public void onDataSetChanged() { 
     itemList = getData(); 
    } 

    @Override 
    public void onDestroy() { 
     itemList.clear(); 
    } 

    @Override 
    public int getCount() { 
     if (itemList != null) 
      return itemList.size(); 
     else 
      return 0; 
    } 

    @Override 
    public RemoteViews getViewAt(int position) { 
     ItemI item = itemList.get(position); 

     RemoteViews rv = new RemoteViews(context.getPackageName(), 
       R.layout.item_view); 

     rv.setTextViewText(R.id.title, item.getTitle()); 
     rv.setImageViewBitmap(R.id.img, getImageBitmap(item.getImage())); 


     Bundle extras = new Bundle(); 
     extras.putInt(BriGeWidgetProvider.EXTRA_ITEM, position); 
     Intent fillIntent = new Intent(); 
     fillIntent.putExtras(extras); 

     rv.setOnClickFillInIntent(R.id.title, fillIntent); 
     rv.setOnClickFillInIntent(R.id.img, fillIntent); 

     return rv; 
    } 

    private Bitmap getImageBitmap(String url) { 
     Bitmap bm = null; 
     try { 
      URL aURL = new URL(url); 
      URLConnection conn = aURL.openConnection(); 
      conn.connect(); 
      InputStream is = conn.getInputStream(); 
      BufferedInputStream bis = new BufferedInputStream(is); 
      bm = BitmapFactory.decodeStream(bis); 
      bis.close(); 
      is.close(); 
     } catch (IOException e) { 
     } 
     return bm; 
    } 

    @Override 
    public RemoteViews getLoadingView() { 
     return null; 
    } 

    @Override 
    public int getViewTypeCount() { 
     return 1; 
    } 

    @Override 
    public long getItemId(int position) { 
     return position; 
    } 

    @Override 
    public boolean hasStableIds() { 
     return true; 
    } 

    private ArrayList<ItemI> getData() { 
     JsonParser jp = new JsonParser(context); 
     return jp.getDataAsList(); 
    } 
} 
} 

回答

1

您可以歸於一個ID,堆項目佈局的根,然後做這個

替換此

rv.setOnClickFillInIntent(R.id.title, fillIntent); 
rv.setOnClickFillInIntent(R.id.img, fillIntent); 

rv.setOnClickFillInIntent(R.id.item_root, fillIntent); 

在你RemoteViewsFactory:

Bundle extras = new Bundle(); 
extras.putInt(BriGeWidgetProvider.EXTRA_ITEM, position); 
extras.putString("title", item.getTitle()); 
// repeat the operations for all the fields of item you need in you result Activity 
Intent fillIntent = new Intent(); 
fillIntent.putExtras(extras); 
中的AppWidgetProvider的的onReceive

String title = intent.getString("title"); 
// repeat the operations for all the fields of item you need in you result Activity 

然後建立你像這樣的活動意圖,而不是創建一個新的空意圖:

Intent openItemIntent = new Intent(context, Result.class); 
openItemIntent.putExtra("title", item.getTitle()); 
// repeat the operations for all the fields of item you need in you result Activity 
openItemIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
context.startActivity(openItemIntent); 

當然,您可以通過使ItemI類實現Parcelable來簡化此操作,而不是分開傳遞所有的字符串。

+0

它可能啓動AppWidgetProvider的onReceive方法中的結果活動? – user3293990

+0

當然,我編輯了答案。只要確保您提供了所有需要避免錯誤的意圖。 – 2Dee

+0

對不起,我不明白你:(你可以在我的BriGeWidgetProvider java代碼中添加你的代碼嗎?如果你可以請幫助我 – user3293990