【问题标题】:Inflating layout inside fragment片段内的膨胀布局
【发布时间】:2019-05-09 21:30:02
【问题描述】:

我有问题。我正在使用 FrameLayout 来使用片段。现在,在我的一个片段中,我想创建一个带有 EditText 的对话框。所以我为我的 fragment.cs 写了这段代码:

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。别忘了....这是一个片段!

有人可以帮我吗?

更新

我得到的错误是:

{Java.Lang.IllegalStateException: 你需要使用 Theme.AppCompat 此活动的主题(或后代)。在 Java.Interop.JniEnvironment+InstanceMethods.CallObjectMethod (Java.Interop.JniObjectReference 实例,Java.Interop.JniMethodInfo 方法,Java.Interop.JniArgumentValue* args) [0x00069] in :0 在 Java.Interop.JniPeerMembers+JniInstanceMethods.InvokeVirtualObjectMethod (System.String 编码成员,Java.Interop.IJavaPeerable 自我, Java.Interop.JniArgumentValue* 参数)[0x0002a] 在 :0 在 Android.Support.V7.App.AlertDialog+Builder.Show() [0x0000a] in :0 在 Appname.Fragments.Intro_Add_Project.b__1_0 (System.Object , System.EventArgs) [0x0005b] 在 C:\Users\Alexander\source\repos\Appname\Appname\Fragments\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) 在 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(Native Method) 在 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:537) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858) }

【问题讨论】:

  • 我不知道 Xamarin,但错误消息似乎与 View view = inflater.Inflate(Resource.Layout.intro_add_new_project, container, false) 行有关。似乎 inflater.Inflate 方法需要一个 Android.Content.Context 对象。
  • 不,错误出现在 (this) 字词 this 的 2 行处
  • 你要我回答这个问题还是解决了?
  • 还没解决,我的问题的最后一部分是我尝试Leon Lu的解决方案时遇到的错误

标签: c# android-fragments xamarin.android


【解决方案1】:

你应该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

【讨论】:

  • 谢谢,但我仍然在线上出现 1 个错误:ProjectNameDialog.Show();...。我将错误添加到问题的更新部分!
  • 你能分享一个演示吗?
  • @A.Vreeswijk 有我的demo,可以参考github.com/851265601/ImageButtonDemo
  • 您是否在此活动中使用了Theme.AppCompat theme (or descendant),例如此链接forums.xamarin.com/discussion/34692/…
  • 我现在没有使用 Theme.AppCompat,但是如何通过操作栏使用它?我已经尝试过:Theme.AppCompat.Light.DarkActionBar,但在我的代码中我使用了:ActionBar.SetCustomView(Resource.Layout.setup_nav_bar); 现在它给出了一个错误......我做错了什么?
【解决方案2】:

根据Xamarin Online DocumentationLayoutInflater.From 方法需要一个 Android.Content.Context 对象。因此,假设您的片段是从 Android.App.Fragment 继承的,正如Xamarin docs sample 建议的那样,this 与您的片段有关,而不是您的应用程序上下文。

LayoutInflater layoutinflater = LayoutInflater.From(this);

【讨论】:

    猜你喜欢
    • 2018-06-22
    • 1970-01-01
    • 1970-01-01
    • 2013-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多