I have this strange bug in my android app. I have one activity with a recycler view and some items in it (in my case there are school subjects four textViews and one framelayout).
When you click on an item a transition with shared elements will be performed and you enter the EditActivity
where you can edit the subject. After the transistion finished the text in the editText
got shifted up. The Text becomes normal only when you click the editText
, i don't know why. Sometimes the text appears normal. Maybe it is because I make a transition from a textView
(in the item) to an editText
(in the EditActitvty).
Please advise. This is my code.
SubjectActivity.java
with RecyclerView:
@Override
protected void onCreate(Bundle savedInstanceState) {
if (Learn.sdk21()) {
//To enable window content transitions in your code instead, call the Window.requestFeature() method:
getWindow().requestFeature(android.view.Window.FEATURE_CONTENT_TRANSITIONS);
Transition ts_enter = new Explode(); //Slide(); //Explode();
Transition ts_exit = new ChangeBounds();
ts_enter.setDuration(Learn.animationTime);
ts_exit.setDuration(Learn.animationTime);
/*
If you have set an enter transition for the second activity,
the transition is also activated when the activity starts.
*/
getWindow().setEnterTransition(ts_enter);
getWindow().setExitTransition(ts_exit);
}
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_subject);
//Database
dao = new DAO(getApplicationContext());
subjectList = dao.getAllSubjectsAlphabetical();
//Custom Toolbar
toolbar = (Toolbar) findViewById(R.id.toolbar_main);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
toolbar.setTitle(R.string.Subject);
recyclerViewSubject = (RecyclerView) findViewById(R.id.recyclerViewSubject);
setRecyclerViewSubject();
//FloatingActionButton
fabAddSubject = (FloatingActionButton)
findViewById(R.id.fabAddSubject);
fabAddSubject.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(getApplicationContext(), AddSubjectActivity.class));
}
});
fabAddSubject.attachToRecyclerView(recyclerViewSubject);
}
private void setRecyclerViewSubject() {
//RecyclerView
subjectRecyclerViewAdapter =
new SubjectRecyclerViewAdapter(this, dao.getAllSubjectsAlphabetical());
subjectRecyclerViewAdapter.setClickListener(this);
recyclerViewSubject.setLayoutManager(new LinearLayoutManager(this));
recyclerViewSubject.setAdapter(new ScaleInAnimationAdapter(subjectRecyclerViewAdapter));
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_subject, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
} else if (id == android.R.id.home) {
this.finish();
return true;
} else if (id == R.id.debugDelete) {
try {
deleteAll();
} catch (Exception e) {
System.out.println("--> Tried to delete all but: " + e + "<--");
}
return true;
} else if (id == R.id.debugAdd) {
try {
add();
} catch (Exception e) {
System.out.println("--> Tried to delete add5: " + e + "<--");
}
return true;
} else if (id == R.id.refreshSubjectList) {
subjectList = dao.getAllSubjectsAlphabetical();
subjectRecyclerViewAdapter.dataChange(subjectList);
}
return super.onOptionsItemSelected(item);
}
@Override
public void itemClicked(View v, int postion) {
editSubject(v, postion);
}
private void editSubject(View v, int pos) {
Intent intent = new Intent(getApplicationContext(), EditSubjectActivity.class);
intent.putExtra("subjectPos", pos);
if (Learn.sdk21()) {
View view = findViewById(R.id.buttonColor);
Pair<View, String> p1 = Pair.create(v.findViewById(R.id.frameLayoutSubjectColor),
v.findViewById(R.id.frameLayoutSubjectColor).getTransitionName());
Pair<View, String> p2 = Pair.create(v.findViewById(R.id.textViewSubject),
v.findViewById(R.id.textViewSubject).getTransitionName());
Pair<View, String> p3 = Pair.create(v.findViewById(R.id.textViewShort),
v.findViewById(R.id.textViewShort).getTransitionName());
Pair<View, String> p4 = Pair.create(v.findViewById(R.id.textViewRoom),
v.findViewById(R.id.textViewRoom).getTransitionName());
Pair<View, String> p5 = Pair.create(v.findViewById(R.id.textViewTeacher),
v.findViewById(R.id.textViewTeacher).getTransitionName());
Pair<View, String> p6 = Pair.create(findViewById(R.id.fabAddSubject),
findViewById(R.id.fabAddSubject).getTransitionName());
ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(SubjectActivity.this,
p1, p2, p3, p4, p5, p6);
intent.putExtra("SubjectColor", v.findViewById(R.id.frameLayoutSubjectColor).getTransitionName());
intent.putExtra("SubjectName", v.findViewById(R.id.textViewSubject).getTransitionName());
intent.putExtra("SubjectShort", v.findViewById(R.id.textViewShort).getTransitionName());
intent.putExtra("SubjectRoom", v.findViewById(R.id.textViewRoom).getTransitionName());
intent.putExtra("SubjectTeacher", v.findViewById(R.id.textViewTeacher).getTransitionName());
startActivityForResult(intent, 12, options.toBundle());
} else {
startActivityForResult(intent, 12);
}
}
private void add() {
String[] name = {"Deutsch", "Englisch", "Biologie", "Mathe", "Geschichte",
"Musik", "Physik", "Politik", "Informatik", "Religion"};
String[] nameshort = {"Deu", "Eng", "Bio", "Mat", "Gesch",
"Mus", "Phy", "PoWi", "Info", "Reli"};
String[] room = {"A222", "T292", "B322", "M22", "G666",
"A373", "B888", "C938", "I999", "T666"};
String[] t = {"Test1", "Test2", "Test3", "Test4", "Test5",
"Test6", "Test7", "Test8", "Test9", "Test10"};
String[] c = {"#fff200", "#ff0000", "#ff9000", "#00bbff", "#2aff00",
"#0037ff", "#90ff00", "#00ff4c", "#00ffb2", "#4c00ff"};
for (int i = 0; i < name.length; i++) {
Subject subject = new Subject(name[i], nameshort[i], room[i], t[i], Color.parseColor(c[i]));
dao.addSubject(subject);
}
setRecyclerViewSubject();
}
private void deleteAll() {
int oldSize = dao.getAllSubjects().size();
for (int i = (oldSize - 1); i >= 0; i--) {
int id = dao.getAllSubjects().get(i).getId();
dao.deleteSubject(id);
}
subjectRecyclerViewAdapter =
new SubjectRecyclerViewAdapter(getApplicationContext(), dao.getAllSubjectsAlphabetical());
recyclerViewSubject.setAdapter(new ScaleInAnimationAdapter(subjectRecyclerViewAdapter));
recyclerViewSubject.setLayoutManager(new LinearLayoutManager(this));
subjectRecyclerViewAdapter.notifyItemRangeRemoved(0, dao.getAllSubjects().size());
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
int subId = data.getIntExtra("subjectId", 0);
int subPos = data.getIntExtra("subjectPos", 0);
int subNewPos = data.getIntExtra("subjectNewPos", subPos);
subjectList = dao.getAllSubjectsAlphabetical();
System.out.print("requestCode" + requestCode
+ "\n" +
"resultCode" + resultCode
+ "\n" +
"subId" + subId
+ "\n" +
"subPos" + subPos
+ "\n" +
"subNewPos" + subNewPos);
if (requestCode == 12) {
if (resultCode == 2) {//Edit
subjectRecyclerViewAdapter.updateItem(subjectList, subPos, subNewPos);
recyclerViewSubject.setAdapter(subjectRecyclerViewAdapter);
} else if (resultCode == 3) {//Delete
subjectRecyclerViewAdapter.removeItem(subjectList, subPos);
recyclerViewSubject.setAdapter(subjectRecyclerViewAdapter);
}
}
}
}
EditSubjectActivity.java:
@Override
protected void onCreate(Bundle savedInstanceState) {
if (Learn.sdk21()) {
//To enable window content transitions in your code instead, call the Window.requestFeature() method:
getWindow().requestFeature(android.view.Window.FEATURE_CONTENT_TRANSITIONS);
Transition ts_enter = new Explode(); //Slide(); //Explode();
Transition ts_exit = new ChangeBounds(); //Slide(); //Explode();
ts_enter.setDuration(Learn.animationTime);
ts_exit.setDuration(Learn.animationTime);
getWindow().setEnterTransition(ts_enter);
getWindow().setExitTransition(ts_exit);
}
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_edit_subject);
//Database
dao = new DAO(getApplicationContext());
//Custom Toolbar
toolbar = (Toolbar) findViewById(R.id.toolbar_main);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
buttonColor = (Button) findViewById(R.id.buttonColor);
buttonColor.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
colorPickerDialog = new ColorPickerDialog(EditSubjectActivity.this, subject.getColor());
colorPickerDialog.setAlphaSliderVisible(false);
colorPickerDialog.setHexValueEnabled(true);
colorPickerDialog.setTitle("Background");
colorPickerDialog.setOnColorChangedListener(new ColorPickerDialog.OnColorChangedListener() {
@Override
public void onColorChanged(int i) {
subject.setColor(i);
buttonColor.setText("#" + Integer.toHexString(subject.getColor()));
buttonColor.setBackgroundColor(i);
}
});
colorPickerDialog.show();
}
});
//EditText
editTextSubject = (EditText) findViewById(R.id.editTextSubject);
editTextShort = (EditText) findViewById(R.id.editTextShort);
editTextRoom = (EditText) findViewById(R.id.editTextRoom);
editTextTeacher = (EditText) findViewById(R.id.editTextTeacher);
//FAB
fabSaveSubject = (FloatingActionButton) findViewById(R.id.fabSaveSubject);
fabSaveSubject.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
saveSubject();
}
});
fabDeleteSubject = (FloatingActionButton) findViewById(R.id.fabDeleteSubject);
fabDeleteSubject.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
deleteSubject();
}
});
setUp();
if(Learn.sdk21()){
Intent intent = getIntent();
editTextSubject.setTransitionName(intent.getStringExtra("SubjectName"));
editTextShort.setTransitionName(intent.getStringExtra("SubjectShort"));
editTextRoom.setTransitionName(intent.getStringExtra("SubjectRoom"));
editTextTeacher.setTransitionName(intent.getStringExtra("SubjectTeacher"));
buttonColor.setTransitionName(intent.getStringExtra("SubjectColor"));
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_add_subject, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
} else if (id == android.R.id.home) {
finish(1);
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
public void onBackPressed() {
super.onBackPressed();
finish(1);
}
private void saveSubject() {
subject.setSubject(editTextSubject.getText().toString());
subject.setSubjectShort(editTextShort.getText().toString());
subject.setRoom(editTextRoom.getText().toString());
subject.setTeacher(editTextTeacher.getText().toString());
dao.updateSubject(subjectId, subject);
finish(2);
}
private void deleteSubject() {
dao.deleteSubject(subjectId);
finish(3);
}
private void setUp() {
Intent intent = getIntent();
subjectPos = intent.getIntExtra("subjectPos", 0);
subject = dao.getAllSubjectsAlphabetical().get(subjectPos);
subjectId = subject.getId();
editTextSubject.setText(subject.getSubject());
editTextShort.setText(subject.getSubjectShort());
editTextRoom.setText(subject.getRoom());
editTextTeacher.setText(subject.getTeacher());
buttonColor.setText("#" + Integer.toHexString(subject.getColor()));
buttonColor.setBackgroundColor(subject.getColor());
}
private void finish(int i) {
Intent intent = new Intent();
intent.putExtra("subjectPos", subjectPos);
intent.putExtra("subjectId", subjectId);
setResult(i, intent);
switch (i) {
case 1: //Nothing
finishAfterTransition();
break;
case 2: //Edit
int newPos = dao.getSubjectPosition(dao.getAllSubjectsAlphabetical(), subject);
intent.putExtra("subjectNewPos", newPos);
finishAfterTransition();
break;
case 3: //Delete
finish();
break;
}
}
}
SubjectRecyclerViewAdapter.java:
public class SubjectRecyclerViewAdapter
extends RecyclerView.Adapter
<SubjectRecyclerViewAdapter.subjectViewHolder> {
LayoutInflater inflater;
List<Subject> subjectList;
Context context;
ClickListener clickListener;
DAO dao;
public SubjectRecyclerViewAdapter(Context context, List<Subject> subjectList) {
inflater = LayoutInflater.from(context);
this.subjectList = subjectList;
this.context = context;
dao = new DAO(context);
}
@Override
public subjectViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = inflater.inflate(R.layout.subject_item, parent, false);
subjectViewHolder holder = new subjectViewHolder(view);
return holder;
}
@Override
public void onBindViewHolder(subjectViewHolder holder, int position) {
Subject subject = subjectList.get(position);
holder.textViewSubject.setText(subject.getSubject());
holder.textViewShort.setText(subject.getSubjectShort());
holder.textViewTeacher.setText(subject.getTeacher());
holder.textViewRoom.setText(subject.getRoom());
holder.frameLayoutSubjectColor.setBackgroundColor(subject.getColor());
if (Learn.sdk21()) {
holder.textViewSubject.setTransitionName("SubjectName_"+position);
holder.textViewShort.setTransitionName("SubjectShort_"+position);
holder.textViewTeacher.setTransitionName("SubjectTeacher_"+position);
holder.textViewRoom.setTransitionName("SubjectRoom_"+position);
holder.frameLayoutSubjectColor.setTransitionName("SubjectColor_" + position);
}
}
@Override
public int getItemCount() {
return subjectList.size();
}
public class subjectViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
TextView textViewSubject,textViewShort, textViewRoom, textViewTeacher;
FrameLayout frameLayoutSubjectColor;
public subjectViewHolder(View itemView) {
super(itemView);
textViewSubject = (TextView) itemView.findViewById(R.id.textViewSubject);
textViewShort = (TextView) itemView.findViewById(R.id.textViewShort);
textViewRoom = (TextView) itemView.findViewById(R.id.textViewRoom);
textViewTeacher = (TextView) itemView.findViewById(R.id.textViewTeacher);
frameLayoutSubjectColor = (FrameLayout) itemView.findViewById(R.id.frameLayoutSubjectColor);
itemView.setOnClickListener(this);
}
@Override
public void onClick(View v) {
if (clickListener != null) {
clickListener.itemClicked(v, getPosition());
}
}
}
public interface ClickListener {
public void itemClicked(View v, int postion);
}
public void setClickListener(ClickListener clickListener) {
this.clickListener = clickListener;
}
public void removeItem(List<Subject> subjectList, int pos) {
this.subjectList = subjectList;
notifyItemRemoved(pos);
System.out.println("removeItem");
}
public void updateItem(List<Subject> subjectList, int pos, int newPos) {
this.subjectList = subjectList;
notifyItemChanged(pos);
if (pos != newPos) {
notifyItemMoved(pos, newPos);
}
System.out.println("updateItem");
}
public void dataChange(List<Subject> subjectList) {
this.subjectList = subjectList;
notifyDataSetChanged();
System.out.println("dataChange");
}
}