java - 试图将此活动转换为android studio中的片段,到目前为止还没有运气
问题描述
这是我的测试活动,我想将其转换为片段。请指导我如何将此活动转换为标签视图内的片段。我是 android 应用程序开发的新手,目前这超出了我的能力范围。
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();
}
}
}
}
这是我的 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;
}
我正在尝试将此活动转换为片段 FragmentA 但我无法做到。任何人请帮助或建议。
解决方案
一般来说,要将一个Activity转换为一个Fragment,通常需要做以下几件事:
将布局从 移动
activity_test2.xml
到fragment_a.xml
。如果 Fragment 应该出现在其父 Activity 中的 Toolbar 下方,请将属性添加app:layout_behavior="@string/appbar_scrolling_view_behavior">
到 Fragment XML 的根布局。将
onCreate
代码从 Activity 移动到onCreateView
Fragment 内的方法。您自己的方法可以简单地复制到 Fragment 类中。要继续
findViewById()
在 Fragment 内部工作,请执行以下操作: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; }
将所有
getApplicationContext()
呼叫替换为getActivity()
如果您覆盖了任何特定于活动的生命周期方法,则可能需要将代码移动到相应的 Fragment 生命周期方法中。例如,
onDestroy
将 Activity 内部的代码移动到onDestroyView
Fragment 内部。可以在此处找到 Activity 和 Fragment 生命周期以及它们之间的关系。
内部AsyncTask
类可以简单地移动到 Fragment 类中。据我现在所见,适配器也可以保持不变。您可能(不完全确定)只需要替换
private Activity activity;
为
private Context context
.
希望这对您有所帮助。
推荐阅读
- php - 如果列包含 Laravel 中的 JSON 编码数据,我如何在数据库中搜索值
- excel - 将数据从 Query 丢失到 Excel 工作表
- ssis - 无法从 SSIS 访问 DB2 的全局临时表
- javascript - 从另一个 XPath 结果获取 XPath 结果
- excel - 如何在 PowerBI / Excel 中创建以下(描述中的链接)数据透视表?
- node.js - Node.js Promise.all 当函数什么都不返回时
- perl - 使用 perl 验证电话号码
- java - Mifare NFC 中的字符串之间的字节是多少?
- java - Spring 测试 - 使用真正的 bean 创建测试 bean
- r - R中每小时数据的时间序列预测