【问题标题】:Argument UserFragment cannot be converted to Fragment参数 UserFragment 无法转换为 Fragment
【发布时间】:2016-08-18 08:26:33
【问题描述】:

我在我的 android studio 项目中发现了错误。我尝试将 SQLite 添加到我的片段中。这是错误。

错误:(75, 25) 错误:MainMenu 类中的方法 updateDisplay 不能应用于给定类型; 必需:片段 找到:用户片段 原因:实参UserFragment无法通过方法调用转换为Fragment

MainMenu.Java

public class MainMenu extends ActionBarActivity {

private DrawerLayout mDrawerLayout;
private NavigationView navigationView;

String address = null;
private ProgressDialog progress;
BluetoothAdapter myBluetooth = null;
BluetoothSocket btSocket = null;
private boolean isBtConnected = false;
//SPP UUID. Look for it
static final UUID myUUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main_menu);

    Intent newint = getIntent();
    address = newint.getStringExtra(DeviceList.EXTRA_ADDRESS);

    new ConnectBT().execute();

    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    ActionBar actionBar = getSupportActionBar();
    actionBar.setHomeAsUpIndicator(R.drawable.ic_menu);
    actionBar.setDisplayHomeAsUpEnabled(true);

    mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
    navigationView = (NavigationView) findViewById(R.id.navigation_view);

    navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
        @Override
        public boolean onNavigationItemSelected(MenuItem menuItem) {
            menuItem.setChecked(true);
            mDrawerLayout.closeDrawers();

            switch (menuItem.getItemId()) {

                case R.id.navigation_item_notification:
                    updateDisplay(new NotificationFragment());
                    break;

                case R.id.navigation_item_user:
                    updateDisplay(new UserFragment());
                    break;

                case R.id.navigation_item_log:
                    updateDisplay(new LogFragment());
                    break;

                case R.id.navigation_sub_item_01:
                    updateDisplay(new AboutFragment());
                    break;

                case R.id.navigation_sub_item_02:
                {
                    if (btSocket!=null) //If the btSocket is busy
                    {
                        try
                        {
                            btSocket.close(); //close connection
                        }
                        catch (IOException e)
                        { msg("Error");}
                    }
                    finish(); //return to the first layout

                }
            }
            return true;
        }
    });

}

private void updateDisplay(Fragment fragment) {

    FragmentManager fragmentManager = getFragmentManager();
    fragmentManager.beginTransaction().replace(R.id.frame_container, fragment).commit();
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    int id = item.getItemId();
    switch (id) {
        case android.R.id.home:
            mDrawerLayout.openDrawer(GravityCompat.START);
            return true;
        case R.id.action_settings:
            return true;

    }

    return super.onOptionsItemSelected(item);
}

private void Disconnect()
{
    if (btSocket!=null) //If the btSocket is busy
    {
        try
        {
            btSocket.close(); //close connection
        }
        catch (IOException e)
        { msg("Error");}
    }
    finish(); //return to the first layout

}

// fast way to call Toast
private void msg(String s)
{
    Toast.makeText(getApplicationContext(),s,Toast.LENGTH_LONG).show();
}

private class ConnectBT extends AsyncTask<Void, Void, Void>  // UI thread
{
    private boolean ConnectSuccess = true; //if it's here, it's almost connected

    @Override
    protected void onPreExecute()
    {
        progress = ProgressDialog.show(MainMenu.this, "Connecting...", "Please wait!!!");  //show a progress dialog
    }

    @Override
    protected Void doInBackground(Void... devices) //while the progress dialog is shown, the connection is done in background
    {
        try
        {
            if (btSocket == null || !isBtConnected)
            {
             myBluetooth = BluetoothAdapter.getDefaultAdapter();//get the mobile bluetooth device
             BluetoothDevice dispositivo = myBluetooth.getRemoteDevice(address);//connects to the device's address and checks if it's available
             btSocket = dispositivo.createInsecureRfcommSocketToServiceRecord(myUUID);//create a RFCOMM (SPP) connection
             BluetoothAdapter.getDefaultAdapter().cancelDiscovery();
             btSocket.connect();//start connection
            }
        }
        catch (IOException e)
        {
            ConnectSuccess = false;//if the try failed, you can check the exception here
        }
        return null;
    }
    @Override
    protected void onPostExecute(Void result) //after the doInBackground, it checks if everything went fine
    {
        super.onPostExecute(result);

        if (!ConnectSuccess)
        {
            msg("Connection Failed. Is it a SPP Bluetooth? Try again.");
            finish();
        }
        else
        {
            msg("Connected.");
            isBtConnected = true;
        }
        progress.dismiss();
    }
}

UserFragment.Java

public class UserFragment extends ActionBarActivity {

private DBManager dbManager;

private ListView listView;

private SimpleCursorAdapter adapter;

final String[] from = new String[]{DatabaseHelper._ID,
        DatabaseHelper.SUBJECT, DatabaseHelper.DESC};

final int[] to = new int[]{R.id.id, R.id.title, R.id.desc};

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.user_fragment);

    dbManager = new DBManager(this);
    dbManager.open();
    Cursor cursor = dbManager.fetch();

    listView = (ListView) findViewById(R.id.list_view);
    listView.setEmptyView(findViewById(R.id.empty));

    adapter = new SimpleCursorAdapter(this, R.layout.activity_view_record, cursor, from, to, 0);
    adapter.notifyDataSetChanged();

    listView.setAdapter(adapter);

    // OnCLickListiner For List Items
    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long viewId) {
            TextView idTextView = (TextView) view.findViewById(R.id.id);
            TextView titleTextView = (TextView) view.findViewById(R.id.title);
            TextView descTextView = (TextView) view.findViewById(R.id.desc);

            String id = idTextView.getText().toString();
            String title = titleTextView.getText().toString();
            String desc = descTextView.getText().toString();

            Intent modify_intent = new Intent(getApplicationContext(), ModifyCountryActivity.class);
            modify_intent.putExtra("title", title);
            modify_intent.putExtra("desc", desc);
            modify_intent.putExtra("id", id);

            startActivity(modify_intent);
        }
    });
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    int id = item.getItemId();
    if (id == R.id.add_record) {

        Intent add_mem = new Intent(this, AddCountryActivity.class);
        startActivity(add_mem);

    }
    return super.onOptionsItemSelected(item);
}

如果我在 UserFragment 上使用 Fragment,我在 UserFragment 上出现错误。但是,如果我在 UserFragment 上使用 ActionBarActivity,我在 MainMenu 上出现错误。有人可以帮助我吗?我的代码有什么问题?

【问题讨论】:

  • 请注意有两个Fragment 类:android.app.Fragmentandroid.support.v4.app.Fragment。我看不到你import 语句,但required: Fragment found: UserFragment 的原因可能是你导入了一个,但使用了另一个。

标签: java android android-fragments


【解决方案1】:

您的 UserFragment 不是 Fragment,而是 Activity 的实例,因为您正在扩展 ActionBarActivity。

【讨论】:

    【解决方案2】:

    将 userfragment 更改为 fragment 而不是 actionbaractivity ,并告诉我您遇到的错误是什么

    【讨论】:

    • 我得到了这个错误 Error:(33, 20) error: onCreate(Bundle) in UserFragment cannot override onCreate(Bundle) in Fragment试图分配较弱的访问权限;是公开的
    【解决方案3】:

    UserFragment 需要继承 Fragment 并且需要实现 onCreateView 方法:

    public class UserFragment extends Fragment {
    
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View fView = inflater.inflate(R.id.your_layour, container, false);
    
        TextView someTextView = (TextView) fView.findViewById(R.id.your_text_view);
    
        return fView;
    
    }
    

    }

    【讨论】:

    • 我得到了这样的错误:错误:(39、21)错误:类 DBManager 中的构造函数 DBManager 不能应用于给定类型; required: Context found: UserFragment 原因: 实参UserFragment不能通过方法调用转换为Context
    【解决方案4】:

    问题依赖于您提供给updateDisplay() 方法的cast and the parametrization。 当涉及到时,以下错误很明显:

    找到的片段:UserFragment 原因:实际参数 UserFragment 无法通过方法调用转换为Fragment

    基本上,在您正在调用的 NavigationItemSelected() 方法中:

    case R.id.navigation_item_user:
        updateDisplay(new UserFragment());
        break;
    

    将 Activity 作为参数传递您的 UserFragment 扩展了作为 Activity 的 ActionBarActivity)。
    但是这个方法应该被赋予一个Fragment,因此在

    中的转换错误
    private void updateDisplay(Fragment fragment) {
        FragmentManager fragmentManager = getFragmentManager();
        fragmentManager.beginTransaction().replace(R.id.frame_container, fragment).commit();
    }
    

    为了解决这个问题,您必须确保您的 UserFragment 扩展了 Fragment 而不是 Activity,否则您将无法将其传递到 FragmentManager 事务

    应该是这样的(或多或少。一定要检查细节):

    public class UserFragment extends Fragment {
    
    private DBManager dbManager;
    private ListView listView;
    private SimpleCursorAdapter adapter;
    
    final String[] from = new String[]{DatabaseHelper._ID, DatabaseHelper.SUBJECT, DatabaseHelper.DESC};
    final int[] to = new int[]{R.id.id, R.id.title, R.id.desc};
    
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.user_fragment,container, false);
        return view;
    }
    
    
    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        dbManager = new DBManager(this);
        dbManager.open();
        Cursor cursor = dbManager.fetch();
    
        listView = (ListView) findViewById(R.id.list_view);
        listView.setEmptyView(findViewById(R.id.empty));
    
        adapter = new SimpleCursorAdapter(this, R.layout.activity_view_record, cursor, from, to, 0);
        adapter.notifyDataSetChanged();
    
        listView.setAdapter(adapter);
    
        // OnCLickListiner For List Items
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long viewId) {
                TextView idTextView = (TextView) view.findViewById(R.id.id);
                TextView titleTextView = (TextView) view.findViewById(R.id.title);
                TextView descTextView = (TextView) view.findViewById(R.id.desc);
    
                String id = idTextView.getText().toString();
                String title = titleTextView.getText().toString();
                String desc = descTextView.getText().toString();
    
                Intent modify_intent = new Intent(getApplicationContext(), ModifyCountryActivity.class);
                modify_intent.putExtra("title", title);
                modify_intent.putExtra("desc", desc);
                modify_intent.putExtra("id", id);
    
                startActivity(modify_intent);
            }
        });
    }
    
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
    
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
    
        int id = item.getItemId();
        if (id == R.id.add_record) {
    
            Intent add_mem = new Intent(this, AddCountryActivity.class);
            startActivity(add_mem);
    
        }
        return super.onOptionsItemSelected(item);
    }
    

    问候,

    【讨论】:

      猜你喜欢
      • 2023-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-05
      • 2020-12-29
      相关资源
      最近更新 更多