【问题标题】:Get Context in fragment from Custom Aler Dialog Class android从自定义警报对话框类android获取片段中的上下文
【发布时间】:2017-07-20 13:00:07
【问题描述】:

我正在为我想在我的片段类中使用的警报对话框编写一个类。我已经在这个类上实现了 AdapterView.OnitemClickListener。我已经为标题、上下文、项目、请求代码、侦听器声明了私有字段。我创建了一个构造函数。现在我想调用这个类并想为不同的目的设置不同类型的字符串。但是我收到声明构造函数的错误。我想知道如何在片段类中调用这个构造函数。我的警报对话框类代码是

public class Alert extends Dialog implements AdapterView.OnItemClickListener{

public interface OnDialogItemClickListener {
    void onDialogItemClick(int requestCode, int position,String item);
}

private String title;
private Context context;
private String[] items;
private int requestcode;
private OnDialogItemClickListener listener;

public Alert(Context context, String title, String[] items, int requestcode, OnDialogItemClickListener listener) {
    super(context,R.style.DialogTheme);
    this.title = title;
    this.items = items;
    this.requestcode = requestcode;
    this.listener = listener;

}
private TextView textView;
private ListView listView;
private Button cancel;
private ArrayAdapter<String> adapter;

@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.first_alertlist_contact);
    textView = (TextView) findViewById(R.id.title);
    listView = (ListView) findViewById(R.id.listView1);
    cancel=(Button)findViewById(R.id.cancel_button);
    adapter = new ArrayAdapter<String>(context, R.layout.first_alertlist_textstyle,android.R.id.text1, items);
    textView.setText(title);
    listView.setAdapter(adapter);
    listView.setOnItemClickListener(this);
}

@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
    listener.onDialogItemClick(requestcode,i, adapter.getItem(i));
    dismiss();
}

}

我的 MainFragment 类是

 public class MainFragment extends DialogFragment implements View.OnClickListener {
 private static final int REQUEST_CODE_SECOND = 2;
 private static final int REQUEST_CODE_FIRST = 1;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {


    View view = inflater.inflate(R.layout.fragment_main, container, false);

    Button button1 = (Button) view.findViewById(R.id.button1);
    button1.setOnClickListener(this);
    //registerForContextMenu(btn);
    Button button2 = (Button) view.findViewById(R.id.button2);
    button2.setOnClickListener(this);
    return view;

}

@Override
public void onClick(View view) {
    switch (view.getId()) {
        case R.id.button1:
            showFirstDialogwithList();
            break;
           .............
            break;
    }

}

private void showFirstDialogwithList() {
    String[] companyName = getResources().getStringArray(R.array.company_name);

 // I am getting error in this line
    Alert alert=new Alert(getActivity().getApplicationContext(),"Contact", companyName,REQUEST_CODE_FIRST,getActivity());
    alert.show();

【问题讨论】:

  • 只要给getActivity()
  • @MohammedFarhan 它显示这不能应用
  • 在这里发布你的日志
  • 如果您的 api 是 23 及以上,请尝试提供getContext()
  • 只使用 getActivity() 而不是 getActivity.getApplicationContext()

标签: android android-activity android-alertdialog android-context


【解决方案1】:
Alert alert=new Alert(getActivity().getApplicationContext(),"Contact", companyName,REQUEST_CODE_FIRST,**getActivity()**);

您将活动上下文作为侦听器的最后一个参数传递。

只需在此处传递 this 关键字并让您的片段实现该回调。

Alert alert=new Alert(getActivity().getApplicationContext(),"Contact", companyName,REQUEST_CODE_FIRST,this);

【讨论】:

    【解决方案2】:

    使用片段活动上下文而不是 getActivity().getApplicationContext()。

    @Override
        public void onAttach(Context context) {
            super.onAttach(context);
    
            Activity a;
    
            if (context instanceof Activity){
                a=(Activity) context;
            }
    
        }
    

    【讨论】:

      【解决方案3】:

      试试这条线

      Alert alert=new Alert(getView().getContext(),"Contact",companyName,REQUEST_CODE_FIRST,getActivity());
      alert.show();
      

      【讨论】:

        【解决方案4】:

        在 Your CoreApplication.java 的代码下编写

        步骤1) 公共类 CoreApplication 扩展应用程序 {

        私有静态CoreApplication实例; .. }

        步骤 2) onCreate(){ …… 实例 = 这个;

        }

        step3 )添加这个方法()

        public static CoreApplication getGlobalApplicationContext() {

            if (instance == null) {
                throw new IllegalStateException("this application does not 
        

        继承 GlobalApplication"); }

            return instance;
        

        }

        步骤 4) 在你的 Fragment.class 中调用这个 Application 方法

        AlertDialog.Builder alert = new AlertDialog.Builder(getGlobalApplicationContext());

        【讨论】:

          猜你喜欢
          • 2015-04-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多