我想创建一个样式(或者我不知道它的名字的东西),然后重复使用它,我的屏幕将有100多个项目,每个项目包含图片和textview,我不认为它是一个在我的xml文件中制作100个布局的好方法,我认为有一种方法可以创建一次(保存图片和textview)然后在我的活动中我会重新创建它。有什么建议吗?
答案 0 :(得分:1)
HEre is a link to Fragments From Android以下是使用片段的项目代码 下面的代码也使用了universalimageloader和ActionBarSherlock,尽管我对动作栏并没有太多帮助。此代码还使用interfaces在片段和主SherlockFragmentActivity之间进行通信。 我已经展示了2个不同的片段。列出可以从一个站点或另一个站点加载数据的片段,以及从使用片段控制活动的接口设置获取其数据的Details片段。 祝你好运,编码愉快。
细节片段
import java.util.HashMap;
import android.app.Activity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import com.actionbarsherlock.app.SherlockFragment;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.display.RoundedBitmapDisplayer;
public class DetailsFrag extends SherlockFragment {
public static final String TAG = "detailsfrag";
private boolean typeFlag;
private GetData gd;
private DisplayImageOptions dio = null;
private ImageLoader il;
private ImageView image;
private TextView name;
private TextView data_box_1;
private TextView data_box_2;
private HashMap<String, Object> fragData;
static DetailsFrag newInstance() {
DetailsFrag frag = new DetailsFrag();
return frag;
}
public interface GetData {
public HashMap<String, Object> getData();
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
gd = (GetData) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString()
+ " must implement GetData");
}
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflate, ViewGroup container,
Bundle savedInstanceState) {
setRetainInstance(true);
setHasOptionsMenu(true);
il = ImageLoader.getInstance();
dio = new DisplayImageOptions.Builder()
.showStubImage(R.drawable.kzfr_logo).cacheInMemory()
.cacheOnDisc().displayer(new RoundedBitmapDisplayer(20))
.build();
View result = inflate.inflate(R.layout.details_frag, container, false);
image = (ImageView) result.findViewById(R.id.image);
data_box_1 = (TextView) result.findViewById(R.id.data_box_1);
data_box_2 = (TextView) result.findViewById(R.id.data_box_2);
name = (TextView) result.findViewById(R.id.name);
fragData = gd.getData();
String imagePath = (String) fragData.get("image");
il.displayImage(imagePath, image, dio);
Toast.makeText(getSherlockActivity(), "Image path " + imagePath,
Toast.LENGTH_LONG).show();
String title = (String) fragData.get("title");
name.setText(title);
String times = (String) fragData.get("times");
data_box_1.setText(times);
String data2 = (String) fragData.get("short_description");
data_box_2.setText(data2);
return result;
}
}
这是List Fragment
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.util.HashMap;
import java.util.List;
import org.json.JSONArray;
import org.json.JSONException;
import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import com.actionbarsherlock.app.SherlockListFragment;
public class ListFrag extends SherlockListFragment {
public static final String TAG = "listfrag";
private boolean typeFlag;
private String mainUrl;
private SetDetails sd;
private List<HashMap<String, Object>> data;
static ListFrag newInstance(boolean type) {
ListFrag frag = new ListFrag();
Bundle args = new Bundle();
args.putBoolean("type", type);
frag.setArguments(args);
return frag;
}
public interface SetDetails {
public void setDetails(HashMap<String, Object> details);
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
sd = (SetDetails) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString()
+ " must implement setDetails");
}
}
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
super.onListItemClick(l, v, position, id);
sd.setDetails(data.get(position));
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
setRetainInstance(true);
// set the type of the listview. Hosts or Programs.
setType();
if (typeFlag) {
mainUrl = "http://website.org/api/dataset1";
} else {
mainUrl = "http://website.org/api/dataset2";
}
// begin a download task to download the data needed to populate the
// correct list view.
if (!checkAdapter()) {
DownloadTask dlTask = new DownloadTask();
dlTask.execute(mainUrl);
} else {
SimpleAdapter adapter = (SimpleAdapter) getListAdapter();
adapter.notifyDataSetChanged();
}
}
public boolean checkAdapter() {
SimpleAdapter adapter = (SimpleAdapter) getListAdapter();
if (adapter != null)
return true;
else
return false;
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
}
@Override
public void onResume() {
super.onResume();
// SimpleAdapter adapter = (SimpleAdapter) getListAdapter();
// if (adapter != null)
// adapter.notifyDataSetChanged();
}
private void setType() {
Bundle args = this.getArguments();
typeFlag = args.getBoolean("type");
}
private boolean checkType() {
return typeFlag;
}
/*
* This method connects to the specified url and returns data ready to be
* parsed.
*/
private String downloadUrl(String strUrl) throws IOException {
String data = "";
InputStream in = null;
try {
URL url = new URL(strUrl);
URLConnection urlConnect = (URLConnection) url.openConnection();
urlConnect.connect();
in = urlConnect.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(
urlConnect.getInputStream()));
StringBuffer sb = new StringBuffer();
String line = "";
while ((line = br.readLine()) != null) {
sb.append(line);
}
data = sb.toString();
br.close();
} catch (Exception e) {
Log.d("Exception while downloading url", e.toString());
} finally {
in.close();
}
return data;
}
private class DownloadTask extends AsyncTask<String, Integer, String> {
String data = null;
@Override
protected String doInBackground(String... url) {
try {
data = downloadUrl(url[0]);
} catch (Exception e) {
Log.d("Background Task", e.toString());
}
return data;
}
@Override
protected void onPostExecute(String result) {
ListViewLoaderTask lvLoader = new ListViewLoaderTask();
lvLoader.execute(result);
}
}
private class ListViewLoaderTask extends
AsyncTask<String, Void, ImageLoaderListAdapter> {
ImageLoaderListAdapter adapter = null;
int count;
HashMap<String, Object> hm = null;
String imgUrl = null;
String url = "http://website.org/u/img/original/";
@Override
protected ImageLoaderListAdapter doInBackground(String... jsonStr) {
List<HashMap<String, Object>> things = null;
JSONArray jArray = null;
try {
jArray = new JSONArray(jsonStr[0]);
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
String[] from = { "title", "image", "short_description" };
int[] to = { R.id.program_title, R.id.program_image,
R.id.short_description };
if (checkType()) {
data1JSONParser data1Parser = new data1JSONParser();
try {
things = data1Parser.parse(jArray);
} catch (Exception e) {
Log.d("Exception", e.toString());
}
} else {
data2JSONParser data2Parser = new data2JSONParser();
try {
things = data2Parser.parse(jArray);
} catch (Exception e) {
Log.d("Exception", e.toString());
}
}
count = things.size();
for (int i = 0; i < count; i++) {
hm = (HashMap<String, Object>) things.get(i);
imgUrl = (String) hm.get("image");
if (!imgUrl.equalsIgnoreCase("false")) {
imgUrl = url + imgUrl;
hm.put("image", imgUrl);
}
}
//ImageLoaderListAdapter is a Simple List Adapter that uses Universal Image
//Loader to load its images if possible.
adapter = new ImageLoaderListAdapter(getSherlockActivity()
.getBaseContext(), things, R.layout.rowlayout, from, to);
data = things;
return adapter;
}
@Override
protected void onPostExecute(ImageLoaderListAdapter adapter) {
setListAdapter(adapter);
ImageLoaderListAdapter ad = (ImageLoaderListAdapter) getListAdapter();
ad.notifyDataSetChanged();
}
}
}
这是片段控制活动I
import java.util.ArrayList;
import java.util.HashMap;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.widget.Toast;
import com.actionbarsherlock.app.SherlockFragmentActivity;
import com.actionbarsherlock.view.Menu;
import com.appdomum.doublea.DayFragment.UpdateList;
import com.appdomum.doublea.DetailsFrag.GetData;
import com.appdomum.doublea.ListFrag.SetDetails;
import com.appdomum.doublea.RadioStream.OnProgramSelectedListener;
import com.appdomum.doublea.ScheduleFrag.UpdateSchedule;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
public class FragmentControl extends SherlockFragmentActivity implements
GetData, SetDetails {
protected ImageLoader imageLoader = ImageLoader.getInstance();
private ListFrag data1Frag;
private ListFrag data2Frag;
private DetailsFrag detailsFrag;
private Fragment visible;
private Fragment mVisibleCached;
private boolean instanceStateSaved;
private HashMap<String, Object> details = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_fragment_control);
setupFragments();
ImageLoaderConfiguration config = ImageLoaderConfiguration
.createDefault(getApplicationContext());
imageLoader.init(config);
}
public void setupFragments() {
final FragmentManager fm = getSupportFragmentManager();
final FragmentTransaction ft = fm.beginTransaction();
data1Frag = ((ListFrag) fm.findFragmentByTag("data1".TAG));
if (data1Frag == null) {
data1Frag = ListFrag.newInstance();
ft.add(R.id.fragment_container, data1Frag , "data1".TAG);
}
visible = data1Frag ;
ft.commit();
}
@Override
public void onBackPressed() {
super.onBackPressed();
visible = mVisibleCached;
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getSupportMenuInflater()
.inflate(R.menu.activity_fragment_control, menu);
return true;
}
@Override
protected void onDestroy() {
if (!instanceStateSaved) {
imageLoader.stop();
}
super.onDestroy();
}
@Override
public void onSaveInstanceState(Bundle outState) {
instanceStateSaved = true;
}
public void showFragment(int fragIn) {
int inFrag = fragIn;
final FragmentManager fm = getSupportFragmentManager();
final FragmentTransaction ft = fm.beginTransaction();
ft.setCustomAnimations(android.R.anim.fade_in, android.R.anim.fade_out);
if (visible != null) {
ft.hide(visible);
mVisibleCached = visible;
}
switch (fragIn) {
case 0:
data1Frag = ((ListFrag) fm.findFragmentByTag(data1));
if (data1Frag == null) {
data1Frag = ListFrag.newInstance(false);
ft.replace(R.id.fragment_container, data1Frag ,
"data1");
} else {
ft.replace(R.id.fragment_container, data1Frag ,
"data1");
if (!data1Frag .isVisible()) {
}
}
ft.addToBackStack(null);
visible = data1Frag ;
break;
case 1:
data2Frag= ((ListFrag) fm.findFragmentByTag("data2"));
if (data2Frag== null) {
data2Frag= ListFrag.newInstance(true);
ft.replace(R.id.fragment_container, data2Frag, "data2");
} else {
ft.replace(R.id.fragment_container, data2Frag, "data2");
if (!data2Frag.isVisible()) {
}
}
ft.addToBackStack(null);
visible = data2Frag;
break;
case 2:
detailsFrag = ((DetailsFrag) fm.findFragmentByTag(DetailsFrag.TAG));
if (detailsFrag == null) {
detailsFrag = DetailsFrag.newInstance();
ft.replace(R.id.fragment_container, detailsFrag,
DetailsFrag.TAG);
} else {
ft.replace(R.id.fragment_container, detailsFrag,
DetailsFrag.TAG);
if (!detailsFrag.isVisible()) {
}
}
ft.addToBackStack(null);
visible = detailsFrag;
break;
}
ft.commit();
}
@Override
public HashMap<String, Object> getData() {
return details;
}
@Override
public void setDetails(HashMap<String, Object> data) {
this.details = data;
showFragment(2);
}
}
这是Fragment Control的布局
<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"
tools:context=".FragmentControl" >
<FrameLayout
android:id="@+id/fragment_container"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
</RelativeLayout>
详细信息片段的布局
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@drawable/woodtileback"
android:padding="10dp" >
<TextView
android:id="@+id/name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:paddingBottom="5dip"
android:paddingTop="10dip"
android:textAlignment="center" />
<ImageView
android:id="@+id/image"
android:layout_width="300dip"
android:layout_height="300dip"
android:layout_below="@id/name"
android:layout_centerHorizontal="true"
android:clickable="true"
android:contentDescription="@string/programdescription" />
<TextView
android:id="@+id/data_box_1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/image"
android:layout_centerHorizontal="true"
android:padding="5dp"
android:textAlignment="center" />
<TextView
android:id="@+id/data_box_2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/data_box_1"
android:layout_centerHorizontal="true"
android:padding="5dp"
android:textAlignment="center" />
</RelativeLayout>
列表行的布局
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingRight="5dp" >
<ImageView
android:id="@+id/program_image"
android:layout_width="100dip"
android:layout_height="100dip"
android:layout_alignParentLeft="true"
android:layout_centerVertical="true"
android:contentDescription="@string/programdescription"
android:padding="5dp" />
<LinearLayout
android:id="@+id/details"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@id/program_image"
android:orientation="vertical" >
<TextView
android:id="@+id/program_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="left" />
<TextView
android:id="@+id/short_description"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="left" />
</LinearLayout>
</RelativeLayout>
就是这样。