参数UserFragment无法转换为Fragment

时间:2016-08-18 08:26:33

标签: java android android-fragments

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

  

错误:(75,25)错误:类MainMenu中的方法updateDisplay无法应用于给定类型;   必需:片段   发现:UserFragment   原因:实际参数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上遇到错误。有人可以帮帮我吗?我的代码有什么问题?

4 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

将userfragment更改为fragment而不是actionbaractivity,告诉我你得到的错误

答案 2 :(得分:0)

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;

}

}

答案 3 :(得分:0)

问题取决于您为cast and the parametrization方法提供的updateDisplay()。 在涉及到这一点时,以下错误是明确的:

  

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

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

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

将活动作为参数传递您的UserFragment扩展了一个ActionBarActivity,这是一个活动)。
但是这个方法应该给出一个片段,因此

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

为了解决这个问题,你必须确保你的UserFragment扩展了一个片段而不是一个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);
}

此致