Afficher le fragment Android sous forme de dialogue ou de fragment habituel
Ce que je suis en train de réaliser est de disposer d'un fragment sur la tablette, il s'affiche comme un DialogFragment
tandis que sur smartphone, il serait indiqué de manière régulière fragment. Je suis consciente qu'il existe déjà un poste similairemais je ne suis pas en mesure de faire ce travail - appliquer le style à l'fragment.
De montrer les choses de haut en bas, MainActivity.java:
public class MainActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == R.id.action_next) {
decideToNext();
return true;
}
return super.onOptionsItemSelected(item);
}
private void decideToNext() {
String device = getString(R.string.device);
if ("normal".equalsIgnoreCase(device)) {
Intent intent = new Intent(this, DetailedActivity.class);
startActivity(intent);
} else if ("large".equalsIgnoreCase(device)) {
Log.d("SOME_TAG", "Yes, I am seeing this line on tablet only");
DetailedFragment fragment = DetailedFragment.newInstance();
getSupportFragmentManager().beginTransaction().add(fragment, "MAGIC_TAG").commit();
}
}
}
DetailedActivity est rien:
public class DetailedActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.detailed_activity);
}
}
sa mise en page:
<fragment xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/root_container"
android:name="com.myapps.sampleandroid.DetailedFragment"
android:layout_width="match_parent"
android:layout_height="match_parent" />
et ce qui est intéressant DetailedFragment
:
public class DetailedFragment extends Fragment {
public static DetailedFragment newInstance() {
return new DetailedFragment();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
Context contextThemeWrapper = new ContextThemeWrapper(getActivity(), R.style.MyDialogTheme);
LayoutInflater localInflater = inflater.cloneInContext(contextThemeWrapper);
return localInflater.inflate(R.layout.detailed_fragment, container, false);
}
}
... et sa mise en page:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Regular Text" />
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Large Text"
android:textAppearance="?android:attr/textAppearanceLarge" />
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button Dummy" />
</LinearLayout>
Dans onCreateView
j'ai essayé de définir le style personnalisé, mais il ne semble pas fonctionner pour tablette.
Style
res/values/styles.xml contient:
<resources>
<style name="AppTheme" parent="@style/Theme.AppCompat.Light.DarkActionBar">
</style>
<style name="MyDialogTheme" />
</resources>
tout res/values-large/styles.xml:
<resources>
<!-- Is there anything I should add here? -->
<style name="MyDialogTheme" parent="@android:style/Theme.Dialog"/>
</resources>
J'ai imbriqué MyDialogTheme
de Theme.Dialog
mais il ne semble pas aider.
Sur smartphone lorsque vous appuyez sur "SUIVANT" de la barre d'action de l'élément de menu que je suis de voir le détail de l'activité (instantané à partir d'un SG2):
tout en tapotant sur le même "SUIVANT" dans le menu de la tablette, il ne fait rien (à l'exception de la visualisation du message sur le Logcat: Yes, I am seeing this line
).
Que dois-je ajouter de plus en styles.xml ou dans le code afin de voir DetailedFragment
comme une boîte de dialogue pour tablette?
MODIFIER
J'ai essayé la solution Petit Enfant proposé (avoir une DialogFragment
contenir mon fragment initial et de l'afficher). Donc, j'ai ajouté un WrapperDetailedFragment
:
public class WraperDetailedFragment extends DialogFragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.wrap_detailed_fragment, container, false);
}
}
sa mise en page:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/root_container_dialog"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<fragment
android:id="@+id/wrapped_fragment_id"
android:layout_width="match_parent"
android:layout_height="match_parent"
class="com.myapps.sampleandroid.DetailedFragment" />
</LinearLayout>
Le code de MainActivity modifications:
private void decideToNext() {
String device = getString(R.string.device);
if ("normal".equalsIgnoreCase(device)) {
Intent intent = new Intent(this, DetailedActivity.class);
startActivity(intent);
} else if ("large".equalsIgnoreCase(device)) {
Log.d("SOME_TAG", "Yes, I am seeing this line ...");
WraperDetailedFragment fragment = new WraperDetailedFragment();
fragment.show(getSupportFragmentManager(), "MAGICAL_TAG");
}
}
mais quand j'essaye d'ajouter cette DialogFragment je suis arriver la suite de crash:
android.view.InflateException: Binary XML file line #8: Error inflating class fragment
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:704)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:746)
at android.view.LayoutInflater.inflate(LayoutInflater.java:489)
at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
at com.myapps.sampleandroid.WraperDetailedFragment.onCreateView(WraperDetailedFragment.java:12)
at android.support.v4.app.Fragment.performCreateView(Fragment.java:1478)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:927)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1082)
at android.support.v4.app.FragmentActivity.onCreateView(FragmentActivity.java:304)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:676)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:746)
at android.view.LayoutInflater.inflate(LayoutInflater.java:489)
at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
at com.myapps.sampleandroid.WraperDetailedFragment.onCreateView(WraperDetailedFragment.java:12)
at android.support.v4.app.Fragment.performCreateView(Fragment.java:1478)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:927)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1104)
at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1460)
at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:440)
at android.os.Handler.handleCallback(Handler.java:615)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4745)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.IllegalArgumentException: Binary XML file line #8: Duplicate id 0x7f050047, tag null, or parent id 0x0 with another fragment for com.myapps.sampleandroid.DetailedFragment
at android.support.v4.app.FragmentActivity.onCreateView(FragmentActivity.java:290)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:676)
... 28 more
source d'informationauteur gunar
Vous devez vous connecter pour publier un commentaire.
Ce problème peut être facilement résolu si au lieu d'essayer de faire un
Fragment
ressembler à unDialogFragment
je regarde de l'autre angle: faire unDialogFragment
ressembler à unFragment
- après tout, unDialogFragment
est unFragment
!La clé de cette solution est d'appeler ou de ne pas
DialogFragment.setShowsDialog();
La modification du
DetailedFragment
:de sa mise en page reste telle qu'elle était,
DetailedActivity
modifications:de sa mise en page ainsi:
et l'appelant activité n':
OK, j'ai été là et fait cela. Pour faire un
DialogFragment
vous avez besoin d'une mise en page définie en XML. Dire, pour cela vous avezLinearLayout
en tant que root. Dans ceLinearLayout
vous pouvez ajouter unfragment class="...."
et lorsque vous affichez votreDialogFragment
ce sera la mêmeFragment
vous affichés côte à côte sur la tablette affiche maintenant dans unDialogFragment
.Comme si. Et gonfler dans votre
DialogFragment
De faire un
DialogFragment
montrer régulierFragment
appeladd()
oureplace()
à l'aide d'un ID de ressource pour le fragment de récipient, d'e.gMais pour faire de l'DialogFragment d'afficher une boîte de dialogue, appel
add(fragment, "Fragment Tag")
. Derrière les coulisses de cette résultats dans un appel àadd(resId, fragment)
réglage de l'ID de ressource pour le fragment contenant 0, ce qui entraîne laDialogFragment
pour définir sonshowAsDialog
option à true.En conséquence vous pouvez utiliser une boîte de dialogue fragment comme une boîte de dialogue ou un fragment selon vos besoins sans avoir à les créer toute une logique spéciale pour le faire.