问题
This is my test activity and I want to convert this into a fragment. Please guide me how to convert this activity into a fragment which is inside a tabview. I am new bee in android app development and this is beyond my reach for now. Any help or suggestion is appreciated.
package in.catking.catking;
import android.content.Intent;
import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.Toast;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.HashMap;
public class test2 extends AppCompatActivity {
String API_KEY = "ABA"; // API owner XYX
String NEWS_SOURCE = "in";
public ListView listNews;
ProgressBar loader;
public ArrayList<HashMap<String, String>> dataList = new ArrayList<HashMap<String, String>>();
static final String KEY_AUTHOR = "author";
static final String KEY_TITLE = "title";
static final String KEY_DESCRIPTION = "description";
static final String KEY_URL = "url";
static final String KEY_URLTOIMAGE = "urlToImage";
static final String KEY_PUBLISHEDAT = "publishedAt";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test2);
listNews = (ListView) findViewById(R.id.listNews);
loader = (ProgressBar) findViewById(R.id.loader);
listNews.setEmptyView(loader);
if(Function.isNetworkAvailable(getApplicationContext()))
{
DownloadNews newsTask = new DownloadNews();
newsTask.execute();
}else{
Toast.makeText(getApplicationContext(), "No Internet Connection", Toast.LENGTH_LONG).show();
}
}
class DownloadNews extends AsyncTask<String, Void, String> {
@Override
protected void onPreExecute() {
super.onPreExecute();
}
protected String doInBackground(String... args) {
String xml = "";
String urlParameters = "";//xml = Function.excuteGet("https://newsapi.org/v2/top-headlines?country="+NEWS_SOURCE+"&apiKey="+API_KEY, urlParameters);
xml = Function.excuteGet("https://newsapi.org/v2/top-headlines?country="+NEWS_SOURCE+"&apiKey="+API_KEY, urlParameters);
return xml;
}
@Override
protected void onPostExecute(String xml) {
if(xml.length()>10){ // Just checking if not empty
try {
JSONObject jsonResponse = new JSONObject(xml);
JSONArray jsonArray = jsonResponse.optJSONArray("articles");
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject jsonObject = jsonArray.getJSONObject(i);
HashMap<String, String> map = new HashMap<String, String>();
map.put(KEY_AUTHOR, jsonObject.optString(KEY_AUTHOR).toString());
map.put(KEY_TITLE, jsonObject.optString(KEY_TITLE).toString());
map.put(KEY_DESCRIPTION, jsonObject.optString(KEY_DESCRIPTION).toString());
map.put(KEY_URL, jsonObject.optString(KEY_URL).toString());
map.put(KEY_URLTOIMAGE, jsonObject.optString(KEY_URLTOIMAGE).toString());
map.put(KEY_PUBLISHEDAT, jsonObject.optString(KEY_PUBLISHEDAT).toString());
dataList.add(map);
}
} catch (JSONException e) {
Toast.makeText(getApplicationContext(), "Unexpected error", Toast.LENGTH_SHORT).show();
}
ListNewsAdapter adapter = new ListNewsAdapter(test2.this, dataList);
listNews.setAdapter(adapter);
listNews.setOnItemClickListener(new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
Intent i = new Intent(test2.this, DetailsActivity.class);
i.putExtra("url", dataList.get(+position).get(KEY_URL));
startActivity(i);
}
});
}else{
Toast.makeText(getApplicationContext(), "No news found", Toast.LENGTH_SHORT).show();
}
}
}
}
this is my ListNewsAdapter
package in.catking.catking;
import android.app.Activity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import com.squareup.picasso.Picasso;
import java.util.ArrayList;
import java.util.HashMap;
/**
* vvklr
*/
class ListNewsAdapter extends BaseAdapter {
private Activity activity;
private ArrayList<HashMap<String, String>> data;
public ListNewsAdapter(Activity a, ArrayList<HashMap<String, String>> d) {
activity = a;
data=d;
}
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) {
ListNewsViewHolder holder = null;
if (convertView == null) {
holder = new ListNewsViewHolder();
convertView = LayoutInflater.from(activity).inflate(
R.layout.list_row, parent, false);
holder.galleryImage = (ImageView) convertView.findViewById(R.id.galleryImage);
holder.author = (TextView) convertView.findViewById(R.id.author);
holder.title = (TextView) convertView.findViewById(R.id.title);
holder.sdetails = (TextView) convertView.findViewById(R.id.sdetails);
holder.time = (TextView) convertView.findViewById(R.id.time);
convertView.setTag(holder);
} else {
holder = (ListNewsViewHolder) convertView.getTag();
}
holder.galleryImage.setId(position);
holder.author.setId(position);
holder.title.setId(position);
holder.sdetails.setId(position);
holder.time.setId(position);
HashMap<String, String> song = new HashMap<String, String>();
song = data.get(position);
try{
holder.author.setText(song.get(test2.KEY_AUTHOR));
holder.title.setText(song.get(test2.KEY_TITLE));
holder.time.setText(song.get(test2.KEY_PUBLISHEDAT));
holder.sdetails.setText(song.get(test2.KEY_DESCRIPTION));
if(song.get(test2.KEY_URLTOIMAGE).toString().length() < 5)
{
holder.galleryImage.setVisibility(View.GONE);
}else{
Picasso.with(activity)
.load(song.get(test2.KEY_URLTOIMAGE).toString())
.resize(300, 200)
.into(holder.galleryImage);
}
}catch(Exception e) {}
return convertView;
}
}
class ListNewsViewHolder {
ImageView galleryImage;
TextView author, title, sdetails, time;
}
I am trying to convert this activity into a fragment FragmentA but I am not able to do it. Anyone please help or suggest.
回答1:
Generally speaking, to convert an Activity to a Fragment, usually needs to do following things:
Move the layout from
activity_test2.xml
tofragment_a.xml
. If the Fragment should appear below a Toolbar in its parent Activity, add the attributeapp:layout_behavior="@string/appbar_scrolling_view_behavior">
to the root Layout of the Fragment XML.Move the
onCreate
code from the Activity to theonCreateView
method inside the Fragment. Your own methods can simply be copied into the Fragment class.To keep
findViewById()
working inside the Fragment, do it like this:public ListView listNews; ProgressBar loader; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_a, container, false); listNews = rootView.findViewById(R.id.listNews); loader = rootView.findViewById(R.id.loader); return rootView; }
Replace all
getApplicationContext()
calls withgetActivity()
If you have overridden any activity specific lifecycle methods, the code may need to be moved into the corresponding Fragment lifecycle method. For example, the code from
onDestroy
inside the Activity is moved toonDestroyView
inside the Fragment. The Activity and Fragment lifecycle and how they are related can be found here.
The AsyncTask
inner class can simply be moved inside the Fragment class.
As far as I can see right now, the Adapter also can stay the same. You may (not totally sure) only need to replace
private Activity activity;
with
private Context context
.
Hope this helps you.
来源:https://stackoverflow.com/questions/54069248/trying-to-convert-this-activity-into-a-fragment-in-android-studio-no-luck-till