【发布时间】:2019-03-10 15:31:50
【问题描述】:
我在我的 Android Studio 应用程序中遇到了与按下后退按钮有关的问题。基本上,用户输入文本视图和另一种方法(不包括在内,因为它工作正常,但如果需要我可以发布)搜索 API 以获取相关数据并将其显示在回收器视图中。然后用户从回收器视图中进行选择,下面的方法解析一个 JSON 文件,并将其中的相关数据添加到一个单独的类“Director”中的一个数组中。一旦发生这种情况,下一个活动“GraphActivity”就会启动,并在画布上为数组中的每个导向器绘制多个节点。
我遇到的问题是,当我在文本视图中输入内容,然后按后退按钮关闭我的 Android 设备上的软键盘(它覆盖了回收器视图)并执行我刚才提到的步骤时,当 GraphActivity 活动启动时它不起作用(没有绘制节点)。但是,如果我按下后退按钮返回到第一个活动,然后再次从回收站视图中进行相同的选择,它就可以工作。
据我所知,问题似乎与添加到“Director”数组的数据有关,但我无法弄清楚是什么原因造成的,Logcat 显示 GraphActivity 活动第一次启动“Director”数组是空的,因此,没有节点被绘制,但是当我按下并再次进行相同的选择时,数组具有正确的数据并且节点被绘制。
我非常感谢您在这方面的帮助,因为我是 Android Studio 的新手,并且一直在寻找几个小时来尝试找到解决方案。
public class MainActivity extends AppCompatActivity implements MainAdapter.OnCompanyClickedListener {
private RecyclerView recyclerView;
private TextView userInput;
private Button search;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
recyclerView = (RecyclerView) findViewById(R.id.rView);
RecyclerView.LayoutManager manager = new LinearLayoutManager(this);
recyclerView.setLayoutManager(manager);
}
//Parse JSON File
public void searchCompanyDirectors(final String companyNumber){
Thread thread = new Thread(new Runnable(){
@Override
public void run(){
HttpClient httpClient = new HttpClient();
try{
final String response = httpClient.run("myURL");
runOnUiThread(new Runnable(){
@Override
public void run(){
try {
JSONObject jsonObject = new JSONObject(response);
JSONArray array = jsonObject.getJSONArray("items");
for (int i = 0; i < array.length();i++){
JSONObject o = array.getJSONObject(i);
String appointment = o.getString("links");
String parsedAppointment = parseApp(appointment);
Director director = new Director(o.getString("name"),parsedAppointment);
Director.directorList.add(director);
}
}catch (JSONException e){
e.printStackTrace();
}
}
});
}
catch (Exception ex){
ex.printStackTrace();
}
}
});
thread.start();
}
@Override
public void onCompanyClicked(int position) {
Toast.makeText(this,Company.companyList.get(position).getTitle(),Toast.LENGTH_LONG).show();
chosenCompanyNumber = Company.companyList.get(position).getCompanyNumber();
chosenCompany = Company.companyList.get(position).getTitle();
searchCompanyDirectors(chosenCompanyNumber);
Intent intent = new Intent(this,GraphActivity.class);
startActivity(intent);
}
}
GraphActivity 类:
public class GraphActivity extends AppCompatActivity {
DrawGraph drawGraph;
@SuppressLint("ClickableViewAccessibility")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
drawGraph = new DrawGraph(this);
setContentView(drawGraph);
DrawGraph 类:
public class DrawGraph extends View {
private Paint p1;
private Paint p2;
private Paint p3;
private Paint paint;
private Path path;
private Point point1;
private int radius = 300;
double x;
double y;
double angle;
int mWidth = this.getResources().getDisplayMetrics().widthPixels;
int mHeight = this.getResources().getDisplayMetrics().heightPixels;
List<Director> directorList = Director.getDirectorList();
private String chosenCompany = MainActivity.getChosenCompany();
private static List<Float> ordinates = new ArrayList<>();
public DrawGraph(Context context) {
super(context);
p1 = new Paint(Paint.ANTI_ALIAS_FLAG);
p1.setStrokeWidth(10);
p2 = new Paint(Paint.ANTI_ALIAS_FLAG);
p2.setStrokeWidth(10);
p3 = new Paint(Paint.ANTI_ALIAS_FLAG);
p3.setStrokeWidth(5);
path = new Path();
paint = new Paint();
point1 = new Point(mWidth/2, mHeight/2);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
// Colors
p1.setStyle(Paint.Style.FILL);
p1.setColor(Color.RED);
p2.setStyle(Paint.Style.FILL);
p2.setColor(Color.GREEN);
p3.setStyle(Paint.Style.STROKE);
p3.setColor(Color.CYAN);
paint.setColor(Color.BLACK);
paint.setTextSize(18f);
paint.setAntiAlias(true);
paint.setTextAlign(Paint.Align.CENTER);
Rect bounds = new Rect();
paint.getTextBounds(chosenCompany, 0, chosenCompany.length(),bounds);
//Draw company and directors
for (int i = 1; i <= directorList.size(); i++)
{
//Divide the company node
angle = i * (360/directorList.size());
x = point1.x + radius * cos(angle);
y = point1.y + radius * sin(angle);
//Draw directors
canvas.drawCircle((float)x,(float)y - (bounds.height() / 2), bounds.width() + 5,p2);
canvas.drawText(directorList.get(i-1).getName(),(float)x,(float)y,paint);
}
【问题讨论】:
-
您的 GraphActivity.class 没有绘制图表,对吧?在哪里\如何将 Director 数据发送到 GraphActivity.class?
-
没有GraphActivity类调用了绘制图形的类,上面两个类我都贴出来
-
如果它有帮助,我已经尝试在 searchDirectors 方法中输出导向器数组,就在它们被添加的位置并且它们被成功添加,但是当我在末尾做同样的事情时“thread.start()”下的方法数组是空的。