Раздувание макета внутри фрагмента - PullRequest
2 голосов
/ 10 мая 2019

У меня проблема. Я использую FrameLayout для использования фрагментов. Теперь в одном из моих фрагментов я хочу создать диалог с EditText. Поэтому я написал этот код для моего фрагмента. Ccs:

public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
    View view = inflater.Inflate(Resource.Layout.intro_add_new_project, container, false);

    ImageButton btnAddProject = view.FindViewById<ImageButton>(Resource.Id.btnAddProject);
    btnAddProject.Click += delegate
    {
        LayoutInflater layoutinflater = LayoutInflater.From(this);
        View DialogView = layoutinflater.Inflate(Resource.Layout.setup_project_name_dialog, null);
        Android.Support.V7.App.AlertDialog.Builder ProjectNameDialog = new Android.Support.V7.App.AlertDialog.Builder(this);
        ProjectNameDialog.SetView(DialogView);

        EditText editProjectName = DialogView.FindViewById<EditText>(Resource.Id.editProjectName);
        ProjectNameDialog.SetCancelable(false);
        ProjectNameDialog.SetPositiveButton("Continue", delegate
        {
            //My own code here
        });
    };


    return view;
}

Теперь у меня проблема с 2x this. Выдает следующую ошибку:

не может конвертировать из 'Appname.Fragments.Intro_Add_Project' в 'Android.Content.Context'

Что я должен заполнить вместо this. Не забудьте .... Это фрагмент!

Может ли кто-нибудь мне помочь?

UPDATE

Я получаю ошибку:

{Java.Lang.IllegalStateException: вам нужно использовать Theme.AppCompat тема (или потомок) с этим действием. в Java.Interop.JniEnvironment + InstanceMethods.CallObjectMethod (Экземпляр Java.Interop.JniObjectReference, Java.Interop.JniMethodInfo метод, Java.Interop.JniArgumentValue * args) [0x00069] в <42dc777b518744fdae9988e94489a4a0>: 0 в Java.Interop.JniPeerMembers + JniInstanceMethods.InvokeVirtualObjectMethod (System.String encodedMember, Java.Interop.IJavaPeerable self, Java.Interop.JniArgumentValue * параметры) [0x0002a] в <42dc777b518744fdae9988e94489a4a0>: 0 в Android.Support.V7.App.AlertDialog + Builder.Show () [0x0000a] в <6bc524e87f8f4e14ab823997c1f60345>: 0 в Appname.Fragments.Intro_Add_Project.b__1_0 (System.Object, System.EventArgs) [0x0005b] в C: \ Users \ Александр \ Source \ репо \ APPNAME \ APPNAME \ Фрагменты \ Intro_Add_Project.cs: 45 --- Конец управляемой трассировки стека Java.Lang.IllegalStateException --- java.lang.IllegalStateException: вам необходимо использовать Theme.AppCompat тема (или потомок) с этим действием. в android.support.v7.app.AppCompatDelegateImplV9.createSubDecor (AppCompatDelegateImplV9.java:354) в android.support.v7.app.AppCompatDelegateImplV9.ensureSubDecor (AppCompatDelegateImplV9.java:323) в android.support.v7.app.AppCompatDelegateImplV9.setContentView (AppCompatDelegateImplV9.java:284) в android.support.v7.app.AppCompatDialog.setContentView (AppCompatDialog.java:83) в android.support.v7.app.AlertController.installContent (AlertController.java:226) на android.support.v7.app.AlertDialog.onCreate (AlertDialog.java:260) на android.app.Dialog.dispatchOnCreate (Dialog.java:407) на android.app.Dialog.show (Dialog.java:302) в android.support.v7.app.AlertDialog $ Builder.show (AlertDialog.java:958) at mono.android.view.View_OnClickListenerImplementor.n_onClick (Native Метод) в mono.android.view.View_OnClickListenerImplementor.onClick (View_OnClickListenerImplementor.java:30) на android.view.View.performClick (View.java:6669) на android.view.View.performClickInternal (View.java:6638) в android.view.View.access $ 3100 (View.java:789) в android.view.View $ PerformClick.run (View.java:26145) в android.os.Handler.handleCallback (Handler.java:873) в android.os.Handler.dispatchMessage (Handler.java:99) в android.os.Looper.loop (Looper.java:193) в android.app.ActivityThread.main (ActivityThread.java:6863) в java.lang.reflect.Method.invoke (родной метод) в com.android.internal.os.RuntimeInit $ MethodAndArgsCaller.run (RuntimeInit.java:537) на com.android.internal.os.ZygoteInit.main (ZygoteInit.java:858)}

Ответы [ 2 ]

2 голосов
/ 10 мая 2019

Вы должны LayoutInflater layoutinflater = LayoutInflater.From(Activity);

и Android.Support.V7.App.AlertDialog.Builder ProjectNameDialog = new Android.Support.V7.App.AlertDialog.Builder(Activity);

Это мой фрагмент кода (не забудьте добавить ProjectNameDialog.Show(); всплывающее окно AlertDialog)

     public class Fragment1 : Fragment
{
    public override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);

        // Create your fragment here
    }

    public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    {
        View view = inflater.Inflate(Resource.Layout.activity_main, container, false);

        ImageButton btnAddProject = view.FindViewById<ImageButton>(Resource.Id.btnAddProject);
        btnAddProject.Click += delegate
        {
            LayoutInflater layoutinflater = LayoutInflater.From(Activity);
            View DialogView = layoutinflater.Inflate(Resource.Layout.setup_project_name_dialog, null);
            Android.Support.V7.App.AlertDialog.Builder ProjectNameDialog = new Android.Support.V7.App.AlertDialog.Builder(Activity);
            ProjectNameDialog.SetView(DialogView);

            EditText editProjectName = DialogView.FindViewById<EditText>(Resource.Id.et_name);
            ProjectNameDialog.SetCancelable(false);
            ProjectNameDialog.SetPositiveButton("Continue", delegate
            {
                //My own code here
            });

            ProjectNameDialog.Show();
        };
        return view;
    }
}

Есть MainActivity.cs

    [Activity(Label = "@string/app_name", Theme = "@style/AppTheme", MainLauncher = true)]
public class MainActivity : AppCompatActivity
{

    protected override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);
        SetContentView(Resource.Layout.main);
       var Fragment1 = new Fragment1();
       FragmentManager.BeginTransaction()
                    .Add(Android.Resource.Id.Content, Fragment1)
                    .Commit();
    }


}

Работает GIF

enter image description here

0 голосов
/ 10 мая 2019

Соответствует Xamarin Online Documentation , LayoutInflater.From метод ожидает объект Android.Content.Context .Итак, предполагая, что ваш фрагмент был унаследован от Android.App.Fragment , как Образец Xamarin docs предполагает, это относится к вашему фрагменту, а не к контексту приложения.

LayoutInflater layoutinflater = LayoutInflater.From(this);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...