无法在片段内显示对话框?

时间:2018-12-26 10:38:58

标签: java android

我创建了一个主类,可以从中调用片段 在我要显示对话框的片段之一中 所以我把对话框显示功能 在Page_6Fragment里面,然后我从Customeradapter内部邀请它 我做了其他尝试,但没有成功。请帮助我,并为《准则》撰写适当的修正案

//Log cat: 
    Process: com.example.android.wacher, PID: 1542
    java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.Resources$Theme android.content.Context.getTheme()' on a null object reference
    at android.app.Dialog.<init>(Dialog.java:173)
    at android.app.Dialog.<init>(Dialog.java:147)
    at com.example.android.wacher.fragments.Page_6Fragment.showDialog(Page_6Fragment.java:147)
    at com.example.android.wacher.adapters.CustomerAdapter$1.onClick(CustomerAdapter.java:65)
    at android.view.View.performClick(View.java:5609)
    at android.view.View$PerformClick.run(View.java:22259)
    at android.os.Handler.handleCallback(Handler.java:751)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:154)
    at android.app.ActivityThread.main(ActivityThread.java:6077)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)

// class Page_6Fragment
public class Page_6Fragment extends android.support.v4.app.Fragment {

    RecyclerView recyclerView;
    List<Customer> customers;
    CustomerAdapter adapter;
    View rootView;
    String TAG = "MainActivity - ";
    Context context;
    API api;

    public static Page_6Fragment newInstance() {
        Page_6Fragment fragment = new Page_6Fragment();
        return fragment;
    }


    @Override
    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
      rootView = inflater.inflate(R.layout.activity_customer, container, false);
        //   View rootView = inflater.inflate(R.xml.pref, container, false);
        //  Intent intent = new Intent(PreferenceDemoActivity.this,PrefsActivity.class);
        // startActivity(intent);

        context = getActivity();
        recyclerView = (RecyclerView) rootView.findViewById(R.id.recycler_view);
        customers = new ArrayList<>();
        adapter = new CustomerAdapter(context, customers);

        adapter.setLoadMoreListener(new CustomerAdapter.OnLoadMoreListener(){
            @Override
            public void onLoadMore() {
                recyclerView.post(new Runnable() {
                    @Override
                    public void run() {
                        int index = customers.size() - 1;
                      loadMore(index);
                    }
                });
                //Calling loadMore function in Runnable to fix the
                // java.lang.IllegalStateException: Cannot call this method while RecyclerView is computing a layout or scrolling error
            }
        });

        recyclerView.setHasFixedSize(true);
        recyclerView.setLayoutManager(new LinearLayoutManager(context));
        //recyclerView.addItemDecoration(new VerticalLineDecorator(2));
        recyclerView.setAdapter(adapter);
        api = ServiceGenerator.createService(API.class);
        load(0);
        return rootView;
    }
    private void load(int index){
        Call<List<Customer>> call = api.getCustomer(index);
        call.enqueue(new Callback<List<Customer>>(){
            @Override
            public void onResponse(Call<List<Customer>> call, Response<List<Customer>> response){
            // Toast.makeText(getActivity(), "tost "+response.body().get(0).post_writer, Toast.LENGTH_LONG).show();
               // Log.i("TRUE_TRUE","Yes"+response.body().get(0).title);
                if(response.isSuccessful()){
                    customers.addAll(response.body());
                    adapter.notifyDataChanged();
                    // Toast.makeText(MainActivity.this, "tost "+response.body().get(0).post_writer, Toast.LENGTH_LONG).show();
                }else{
                    Log.e(TAG," Response Error "+String.valueOf(response.code()));
                }
            }
            @Override
            public void onFailure(Call<List<Customer>> call, Throwable t) {
                Log.e(TAG," Response Error "+t.getMessage());
            }
        });
    }

    private void loadMore(int index){
        //add loading progress view
        customers.add(new Customer("load"));
        adapter.notifyItemInserted(customers.size()-1);
        Call<List<Customer>>call =  api.getCustomer(index);
        call.enqueue(new Callback<List<Customer>>(){
            @Override
            public void onResponse(Call<List<Customer>> call, Response<List<Customer>>response) {
                if(response.isSuccessful()){
                    // remove loading view .......
                    customers.remove(customers.size()-1);
                    List<Customer>result=response.body();
                    if(result.size()>0){
                        // add loaded data
                        customers.addAll(result);
                    }else{//result size 0 means there is no more data available at server
                        adapter.setMoreDataAvailable(false);
                        //telling adapter to stop calling load more as no more server data available
                        Toast.makeText(context,"No More Data Available",Toast.LENGTH_LONG).show();
                    }
                    adapter.notifyDataChanged();
                }else{
                    Log.e(TAG," Load More Response Error "+String.valueOf(response.code()));
                }
            }
            @Override
            public void onFailure(Call<List<Customer>>call,Throwable t) {
                Log.e(TAG," Load More Response Error "+t.getMessage());
            }
        });
    }


public void showDialog(){
    Dialog dialog = new Dialog(getActivity());
    dialog.setCancelable(true);
    View view  = getActivity().getLayoutInflater().inflate(R.layout.layout, null);
    dialog.setContentView(view);
    dialog.show();
}


}
//CustomerAdapter 


public class CustomerAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

    public final int TYPE_MOVIE = 0;
    public final int TYPE_LOAD = 1;

    static Context context;
    List<Customer> customers;
    OnLoadMoreListener loadMoreListener;
    boolean isLoading = false, isMoreDataAvailable = true;

    public CustomerAdapter(Context context, List<Customer> customers) {
        this.context = context;
        this.customers = customers;
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

        LayoutInflater inflater = LayoutInflater.from(context);
        if(viewType==TYPE_MOVIE){
            return new CustomerHolder(inflater.inflate(R.layout.row_movie,parent,false));
        }else{
            return new LoadHolder(inflater.inflate(R.layout.row_load,parent,false));
        }

    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) {
        if(position>=getItemCount()-1 && isMoreDataAvailable && !isLoading && loadMoreListener!=null){
            isLoading = true;
            loadMoreListener.onLoadMore();
        }
        if(getItemViewType(position)==TYPE_MOVIE){
            ((CustomerHolder)holder).bindData(customers.get(position));
            if(((CustomerHolder)holder).buttonViewOption != null)((CustomerHolder)holder).buttonViewOption.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    //Toast.makeText(context, ""+ position, Toast.LENGTH_LONG).show();

                    Page_6Fragment.newInstance().showDialog();
                }
            });
        }
    }




    @Override
    public int getItemViewType(int position) {
        if(customers.get(position).type.equals("movie")){
            return TYPE_MOVIE;
        }else{
            return TYPE_LOAD;
        }

    }

    @Override
    public int getItemCount(){

        return customers.size();
    }

    /* VIEW HOLDERS */

    static class CustomerHolder extends RecyclerView.ViewHolder{
        TextView tvTitle;
        TextView tvRating;
        Button buttonViewOption;

        public CustomerHolder(View itemView) {
            super(itemView);
            tvTitle=(TextView)itemView.findViewById(R.id.title);
            tvRating=(TextView)itemView.findViewById(R.id.rating);
            buttonViewOption = (Button) itemView.findViewById(R.id.textViewOptions);
        }

        void bindData(Customer cust){
           tvTitle.setText(cust.name);
           tvRating.setText(cust.title);
        }
    }

    static class LoadHolder extends RecyclerView.ViewHolder{
        public LoadHolder(View itemView) {
            super(itemView);
        }
    }

    public void setMoreDataAvailable(boolean moreDataAvailable) {
        isMoreDataAvailable = moreDataAvailable;
    }

    /* notifyDataSetChanged is final method so we can't override it
         call adapter.notifyDataChanged(); after update the list
    */

    public void notifyDataChanged(){
        notifyDataSetChanged();
        isLoading = false;
    }


    public interface OnLoadMoreListener{
        void onLoadMore();
    }

    public void setLoadMoreListener(OnLoadMoreListener loadMoreListener) {
        this.loadMoreListener = loadMoreListener;
    }
}

//HomeActivity

public class HomeActivity extends AppCompatActivity {

    TextView mToolBarTextView;
    Toolbar toolbar;
    private Context mContext;
    //FragmentManager fm;
    //Fragment selectedFragment = null;
    Fragment selectedFragment;
    private int count;
    private int tootalPrice;
    private int[] totalParts;
    public  int[] tP;
    EditText et1;
    EditText et2;
    EditText et3;
    EditText et4;
    // butNext

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        mContext = this;
        getLayoutInflater().inflate(R.layout.toolbar, (ViewGroup) findViewById(android.R.id.content));
        toolbar = (Toolbar) findViewById(R.id.toolbar);
        mToolBarTextView = (TextView) findViewById(R.id.text_view_toolbar_title);
        BottomNavigationView bottomNavigationView = (BottomNavigationView)
        findViewById(R.id.navigation);
        bottomNavigationView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {

            @Override
            public boolean onNavigationItemSelected(@NonNull MenuItem item) {
                selectedFragment = null;
                LinearLayout root;
                switch (item.getItemId()) {
                    case R.id.action_item1:
                        selectedFragment = Page_3Fragment.newInstance();
                        // selectedFragment = Page_2Fragment.newInstance();
                        break;
                    case R.id.action_item2:
                        //   selectedFragment = Page_2Fragment.newInstance();
                        selectedFragment= null;
                        selectedFragment = Page_6Fragment.newInstance();
                        break;
                    case R.id.action_item3:
                        //Intent intent = new Intent(HomeActivity.this,PrefsActivity.class);
                        //startActivity(intent);
                        selectedFragment = new PreferenceFragmentCustom();
                        //  addBar();
                        //   initToolbar();
                        // selectedFragment=preferenceFragment;// Page_4Fragment.newInstance();
                        // selectedFragment = Page_4Fragment.newInstance();
                        break;
                }
                FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
                transaction.replace(R.id.frame_layout, selectedFragment);
                transaction.commit();
                return true;
            }
        });

        // Manually displaying the first fragment - one time only
        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
        transaction.replace(R.id.frame_layout, Page_1Fragment.newInstance());
        transaction.commit();
        FunctionToolbar("الرئيسية");
        // Used to select an item programmatically
        // bottomNavigationView.getMenu().getItem(2).setChecked(true);
    }
    public void ShowDailoge(){

        Dialog dialog = new Dialog(this);
        dialog.setCancelable(true);
        View view  = selectedFragment.getActivity().getLayoutInflater().inflate(R.layout.layout, null);
        dialog.setContentView(view);
        dialog.show();

    }

1 个答案:

答案 0 :(得分:0)

您应从 selectedFragment.getActivity()

中删除 ShowDailoge()

尝试

 public void ShowDailoge(){
    Dialog dialog = new Dialog(this);
    dialog.setCancelable(true);
    dialog.setContentView(R.layout.layout_name);
    dialog.show();
    }

仅供参考

您应将 getActivity() 用于-> 片段 ActivityName.this 对于-> 活动 部分。