2016-11-04 5 views
0

Ich habe die DialogFragment folgendeAktivität hinter DialogFragment akzeptiert noch berührt

public class DetailItemFragment extends AppCompatDialogFragment { 


@BindView(R.id.task_detail_name) 
AppCompatTextView taskDetailNameText; 
@BindView(R.id.task_detail_description) 
AppCompatTextView taskDetailDescriptionText; 
@BindView(R.id.task_detail_priority) 
AppCompatTextView taskDetailPriorityText; 
@BindView(R.id.toolbar) 
Toolbar toolbar; 

@Override 
public Dialog onCreateDialog(Bundle savedInstanceState) { 
    Dialog dialog = super.onCreateDialog(savedInstanceState); 
    dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); 
    dialog.setCanceledOnTouchOutside(true); //doesn't work 
    dialog.setCancelable(true); //doesn't work 
    return dialog; 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.fragment_detail_view, container, false); 
    ButterKnife.bind(this, view); 

    //Get the Json back and parse it as a Task 
    Bundle bundle = getArguments(); 
    final String taskAsJson = bundle.getString("task"); 
    Task task = new Gson().fromJson(taskAsJson, Task.class); 

    ((AppCompatActivity) getActivity()).setSupportActionBar(toolbar); 
    ActionBar actionBar = ((AppCompatActivity) getActivity()).getSupportActionBar(); 
    if (actionBar != null) { 
     actionBar.setDisplayShowTitleEnabled(false); 
     actionBar.setDisplayHomeAsUpEnabled(true); 
     actionBar.setHomeButtonEnabled(true); 
     actionBar.setHomeAsUpIndicator(R.drawable.close); 
    } 
    setHasOptionsMenu(false); 

    taskDetailNameText.setText(task.getName()); 
    taskDetailDescriptionText.setText(task.getDescription()); 
    taskDetailPriorityText.setText(task.getPriority().toString()); 

    return view; 
} 

ich das Fragment Transaktionen wie so

//Put the clicked item into a Bundle for the next fragment to consume 
DialogFragment detailItemFragment = new DetailItemFragment(); 
Bundle args = new Bundle(); 
args.putString("task", new Gson().toJson(mTaskListAdapter.getItem(position))); 
detailItemFragment.setArguments(args); 

getActivity().getSupportFragmentManager().beginTransaction() 
      .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN) 
      .add(R.id.task_detail_fragment_container, detailItemFragment) 
      .addToBackStack(null) 
      .commit(); 

Ich versuche folgendes zu erreichen: * Auf einer Tablette/Großbildschirm, dies wird als Dialog-Popup angezeigt * Auf einem Telefon wird es einen Vollbild-Dialog anzeigen (ziemlich versucht zu replizieren, wie Google Kalender Ereigniseröffnungsdetails behandelt)

Dies ist, was mein xlarge/activity_main.xml sieht aus wie

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:id="@+id/container" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <FrameLayout 
     android:id="@+id/task_detail_fragment_container" 
     android:layout_width="800dp" 
     android:layout_height="400dp" 
     android:layout_centerInParent="true" 
     android:elevation="16dp" /> 

    <android.support.design.widget.AppBarLayout 
     android:id="@+id/header" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content"> 

     <android.support.v7.widget.Toolbar 
      android:id="@+id/toolbar" 
      style="@style/ToolbarStyle" 
      android:background="@color/colorPrimary" 
      app:title="@string/app_name" 
      app:titleTextColor="@color/white" /> 
    </android.support.design.widget.AppBarLayout> 

    <FrameLayout 
     android:id="@+id/task_fragment_container" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_below="@+id/header" /> 

    <android.support.design.widget.FloatingActionButton 
     android:id="@+id/fab_add" 
     android:layout_width="@dimen/fab_normal_size" 
     android:layout_height="@dimen/fab_normal_size" 
     android:layout_alignParentBottom="true" 
     android:layout_alignParentEnd="true" 
     android:layout_marginBottom="@dimen/fab_padding" 
     android:layout_marginEnd="@dimen/fab_padding" 
     android:src="@drawable/add_black" 
     app:elevation="@dimen/fab_elevation" 
     app:fabSize="normal" 
     app:layout_anchorGravity="bottom|right|end" 
     app:pressedTranslationZ="@dimen/fab_pressed_elevation" /> 
</RelativeLayout> 

Sie werde ich eine FrameLayout bemerken, die auf dem Bildschirm zum Laden der DetailItemFragment in zentriert ist. Vielleicht ist das nicht der richtige Weg - aber ich möchte es aufgreifen, falls sich herausstellt, dass es das Problem ist.

Dies ist, was die fragment_detail_view.xml Layout wie die Activity im Hintergrund immer noch kann ich mit interagieren Berührungen auf einer Tablette, (dh

Wenn die DialogFragment offen sieht

<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/container" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="@color/task_detail_background" 
    android:clickable="true" 
    android:elevation="8dp" 
    tools:context="io.havoc.todo.view.fragments.DetailItemFragment"> 

    <android.support.design.widget.AppBarLayout 
     android:id="@+id/appbar" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     app:elevation="0dp"> 

     <android.support.v7.widget.Toolbar 
      android:id="@+id/toolbar" 
      android:layout_width="match_parent" 
      android:layout_height="@dimen/toolbar_tall_height" 
      android:background="?attr/colorPrimary"> 

      <android.support.v7.widget.AppCompatTextView 
       android:id="@+id/task_detail_name" 
       style="@style/TextAppearance.Widget.AppCompat.Toolbar.Title" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:layout_gravity="start|bottom" 
       android:layout_marginBottom="@dimen/activity_vertical_margin" 
       android:gravity="start|bottom" 
       android:padding="8dp" 
       android:text="Task detail" 
       android:textColor="@color/white" 
       android:textSize="24sp" /> 
     </android.support.v7.widget.Toolbar> 
    </android.support.design.widget.AppBarLayout> 

    <LinearLayout 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_marginBottom="@dimen/activity_vertical_margin" 
     android:layout_marginStart="86dp" 
     android:layout_marginTop="@dimen/activity_vertical_margin" 
     android:orientation="vertical" 
     app:layout_behavior="@string/appbar_scrolling_view_behavior"> 

     <android.support.v7.widget.AppCompatTextView 
      style="@style/TextAppearance.AppCompat.Body2" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_marginTop="@dimen/spacing_margin" 
      android:text="@string/hint_task_description" 
      android:textColor="@color/colorAccent" /> 

     <android.support.v7.widget.AppCompatTextView 
      android:id="@+id/task_detail_description" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_marginTop="8dp" 
      android:text="Description text" 
      android:textColor="@color/text_primary" 
      android:textSize="18sp" /> 

     <android.support.v7.widget.AppCompatTextView 
      style="@style/TextAppearance.AppCompat.Body2" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_marginTop="@dimen/spacing_margin" 
      android:text="@string/hint_task_priority" 
      android:textColor="@color/colorAccent" /> 

     <android.support.v7.widget.AppCompatTextView 
      android:id="@+id/task_detail_priority" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_marginTop="8dp" 
      android:text="Priority" 
      android:textColor="@color/text_primary" 
      android:textSize="18sp" /> 
    </LinearLayout> 
</android.support.design.widget.CoordinatorLayout> 

Die Frage akzeptiert die Activity, als ob der Dialog nicht einmal vorhanden wäre); Darüber hinaus habe ich keine Ahnung, wie man die DialogFragment zu entlassen, wenn man außerhalb davon berührt. Ich habe folgendes versucht:

  • dialog.setCanceledOnTouchOutside(true); (im onCreateDialog() Methode)
  • dialog.setCancelable(true); (im onCreateDialog() Methode)
  • dialog.setCanceledOnTouchOutside(false); (im onCreateDialog() Methode)
  • getDialog().setCanceledOnTouchOutside(true); setCancelable(true); (führt zu NullPointerExceptions - durchgeführt in onCreateView() für die DialogFragment)

Ich habe all die anderen Fragen durchgelesen, die ich finden konnte und nichts hat für mich funktioniert - also mache ich eindeutig etwas falsch.

Ich schätze jede und alle Hilfe.

Antwort

0

Die FrameLayout (task_detail_fragment_container) Sie hinzufügen Ihre DetailItemFragment TO hat eine andere Größe dann die Eltern, was bedeutet, es wird nicht das gesamte Layout abdecken:

... 
     android:layout_width="800dp" 
     android:layout_height="400dp" 
... 

Um dies zu beheben, stellen task_detail_fragment_container die gleiche Größe wie das Eltern-Layout (match_parent) und die Größe des Dialogs im Dialog Layout Kappe durch ein anderes Layout nach Ihrem container Layout Einführung:

<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/container" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="@android:color/transparent" 
    android:clickable="true" 
    android:elevation="8dp" 
    tools:context="io.havoc.todo.view.fragments.DetailItemFragment"> 

    <FrameLayout 
     andorid:width="800dp" 
     android:height="400dp" 
     android:layout_centerInParent="true"> 

     <android.support.design.widget.AppBarLayout ... 
     //rest of your xlm here 
    </FrameLayout> 
</android.support.design.widget.CoordinatorLayout> 
+0

ich schon haben. Die Berührungen gehen nicht durch den Dialog - aber ich kann Elemente außerhalb des Dialogs berühren. – Nxt3

+0

Ja. Ich bin mir nicht sicher, worauf Sie hinauswollen. Ich aktualisierte das op, um den Code für mein 'fragment_detail_view.xml' einzuschließen, und es ist bereits' anklickbar' – Nxt3

+0

redigierte die Antwort – C0D3LIC1OU5

0

Änderung t o .dialog.setCancelable(false);.

Wenn es ein Dialog mit Schaltflächen OK und Abbrechen ist, können Sie verwenden:

.setCancelable(closeActivity == true ? false : true) 
+0

https://developer.android.com/reference/android/app/Dialog.html#setCancelable(boolean) sagt 'Legt fest, ob dieser Dialog mit der BACK-Schaltfläche abgebrochen werden kann Schlüssel.' Wie wird das helfen? – C0D3LIC1OU5

+0

Ich habe keine Tasten; Das ist auch schon im OP und ich sagte, es hat nicht funktioniert. – Nxt3

+0

Zurück Schlüssel ist nicht sein Problem! Er sagt: "Ich kann mit der Aktivität interagieren, als ob der Dialog gar nicht vorhanden wäre". –

0

Ändern dieses

dialog.setCanceledOnTouchOutside(true); 

mit

dialog.setCanceledOnTouchOutside(false); 
+0

Beide versuchten und nichts änderte sich. – Nxt3

Verwandte Themen