【发布时间】:2017-07-31 15:25:44
【问题描述】:
我的应用由导航抽屉和 4 个片段构成。 该应用程序的旧版本使用活动,因此我需要在片段中转换该活动。
目前一切正常,但在一个 Fragment 我有 80 个 Buttons 用户可以设置文本和背景颜色,调用 DialogActivity 的方法是唯一一个管理所有 Fragments 的 MainActivity和onActivityResults 由Fragments 内的对话框调用以管理用户更改。
当屏幕方向变为横向时会出现问题。
如果我按Buttons 并设置文本和颜色所有作品纵向但如果改变屏幕方向与横向我会得到类似“阴影”的背景和按钮我没有改变当我单击它们时它们的属性,但如果我再次旋转屏幕,更改的按钮变得可见。
奇怪的是,在片段背景中,我看到了正确更新的按钮,但没有在顶部...(我发布了一张照片,很难解释)
我更改的旧按钮仍然更改,因为我将其保存到 DB,但是对于横向我无法更新其他按钮...
代码:
MainActivity.java
public class MainActivity extends AppCompatActivity
implements NavigationView.OnNavigationItemSelectedListener {
static String clickedButtonViewId;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
drawer.setDrawerListener(toggle);
toggle.syncState();
NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
navigationView.setNavigationItemSelectedListener(this);
if (findViewById(R.id.content_frame) != null){
getSupportFragmentManager().beginTransaction()
.add(R.id.content_frame, new OrarioFragment()).commit();
}
}
@Override
public void onBackPressed() {
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
if (drawer.isDrawerOpen(GravityCompat.START)) {
drawer.closeDrawer(GravityCompat.START);
} else {
super.onBackPressed();
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, 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;
}
return super.onOptionsItemSelected(item);
}
@SuppressWarnings("StatementWithEmptyBody")
@Override
public boolean onNavigationItemSelected(MenuItem item) {
// Handle navigation view item clicks here.
int id = item.getItemId();
FragmentManager fragmentManager = getSupportFragmentManager();
if (id == R.id.nav_orario) {
fragmentManager.beginTransaction()
.replace(R.id.content_frame, new OrarioFragment())
.commit();
} else if (id == R.id.nav_calendario) {
fragmentManager.beginTransaction()
.replace(R.id.content_frame, new CalendarioFragment())
.commit();
} else if (id == R.id.nav_voti) {
fragmentManager.beginTransaction()
.replace(R.id.content_frame, new VotiFragment())
.commit();
} else if (id == R.id.nav_registrazioni) {
fragmentManager.beginTransaction()
.replace(R.id.content_frame, new RegistrazioniFragment())
.commit();
} else if (id == R.id.nav_share) {
} else if (id == R.id.nav_send) {
}
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
drawer.closeDrawer(GravityCompat.START);
return true;
}
public void addMateria(View v){
/* Prendo il nome della risorsa cosi nel ricompilare il progetto non perdo *
* tutti i riferimenti ai bottoni salvati nel database */
clickedButtonViewId = getResources().getResourceEntryName(v.getId());
//StartActivityForResult perche mi aspetto la materia inserita dall'altra activity
Intent myIntent = new Intent(MainActivity.this, ActivityAddMateria.class);
startActivityForResult(myIntent, 1);
//onStop();
}
//Take back data from ActivityAddMateria
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if(requestCode == 1) {
if (resultCode == RESULT_OK) {
MySQLiteHelper db = new MySQLiteHelper(this);
//Cambio subito il Button
int resId = getResources().getIdentifier(clickedButtonViewId, "id", getPackageName());
final Button clickedtextView = (Button) findViewById(resId);
String result = data.getStringExtra("result"); //Take the materia from Dialog
int color = data.getIntExtra("color", 1); //Take the color from Dialog
//Controllo se il Button è già presente nel db se presente aggiorno se non presente inserisco
boolean modifica = db.Exists(clickedButtonViewId);
//Se voglio ripristinare il bottone di default
if (color == getResources().getColor(R.color.blue_orario)) {
//Ripristino la grafica di Default
Drawable style = setButtonColor(color);
clickedtextView.setBackground(style);
clickedtextView.setText("New");
//Se la materia è nel database la cancello
if (modifica) {
db.deleteSingleMateria(clickedButtonViewId);
}
} else {
//Quando inserisco un normale bottone colorato
if (!modifica) {
//Materia da inserire in un nuovo spazio
db.addMateriaToDb(new Materia(clickedButtonViewId, result, color));
} else {
//Materia già presente nel Button quindi aggiorno la materia
db.updateMateria(new Materia(clickedButtonViewId, result, color));
Toast.makeText(getApplicationContext(), "Materia modificata!",
Toast.LENGTH_LONG).show();
}
//Inserisco la materia nel DB dei voti_media
db.addMateriaVotiFromOrario(new MaterieVoti(result, 0.0));
clickedtextView.setText(result);
//clickedtextView.setBackgroundColor(color);
//clickedtextView.getBackground().setColorFilter(color, PorterDuff.Mode.MULTIPLY);
Drawable style = setButtonColor(color);
clickedtextView.setBackground(style);
}
}
if (resultCode == RESULT_CANCELED) {
//Nessuna materia inserita
}
}
}//onActivityResult
编辑
好的,我发现了问题。
在 MainActivity 我有这行代码来强制显示第一个片段
if (findViewById(R.id.content_frame) != null){
getSupportFragmentManager().beginTransaction()
.add(R.id.content_frame, new OrarioFragment()).commit();
}
当屏幕方向改变时,MainActivity 会重新创建,并且如果我使用 .add() 会在旧片段上加载相同的片段
那么,当应用开始避免这个问题时,如何设置片段显示?
我管理抽屉有问题?
【问题讨论】:
-
显示您的代码。
-
@Bryan 添加了代码,如果需要更多,请告诉 :)
-
你也可以分享你的布局吗?
-
@JRG 全部两个还是只有 main_activity 或 fragmet?
-
两者都会让事情变得清晰
标签: android android-fragments navigation-drawer screen-orientation