#android #android-fragments #android-activity #sms
#Android #android-фрагменты #android-активность #sms
Вопрос:
Я разрабатываю приложение для SMS, но я новичок в разработке приложений, поэтому у меня возникли проблемы, пожалуйста, помогите мне. Пока я могу получать сообщения, но проблема в том, что я могу показывать SMS только для действия, но вместо этого я хочу показывать их во фрагменте.
Ниже мой «FetchingInboxActivity.java »
import android.Manifest;
import android.app.Activity;
import android.content.ContentResolver;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import androidx.fragment.app.FragmentManager;
import java.util.ArrayList;
public class FetchingInboxActivity extends Activity {
ListView listView;
private static final int PERMISSIONS_REQUEST_READ_CONTACTS = 100;
ArrayList<String> smsList;
private static final String TAG = FetchingInboxActivity.class.getSimpleName();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_fetching_inbox);
listView = (ListView) findViewById(R.id.abcd);
int permissioncheck = ContextCompat.checkSelfPermission(this,
Manifest.permission.READ_SMS);
if(permissioncheck == PackageManager.PERMISSION_GRANTED){
showContacts();
} else{
ActivityCompat.requestPermissions(this, new String[]{
Manifest.permission.READ_SMS}, PERMISSIONS_REQUEST_READ_CONTACTS);
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[]
permissions,
@NonNull int[] grantResults) {
if (requestCode == PERMISSIONS_REQUEST_READ_CONTACTS) {
if(grantResults[0] == PackageManager.PERMISSION_GRANTED){
showContacts();
}
} else{
Toast.makeText(this, "Grant kro be", Toast.LENGTH_LONG).show();
}
}
private void showContacts() {
Uri inboxUri = Uri.parse("content://mms-sms/conversations/?simple=true");
smsList = new ArrayList<>();
ContentResolver contentResolver = getContentResolver();
Cursor cursor = contentResolver.query(inboxUri, null, null, null, null);
while (cursor.moveToNext()){
String number =
cursor.getString(cursor.getColumnIndexOrThrow("address")).toString();
String body =
cursor.getString(cursor.getColumnIndexOrThrow("body")).toString();
smsList.add("Number: " number "n" "Body: " body);
Log.d(TAG, "showcontacts: ");
}
cursor.close();
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, smsList);
listView.setAdapter(adapter);
}
}
Ниже приведен мой XML-файл «FetchingInboxActivity.java »
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".FetchingInboxActivity"
android:id="@ id/containr">
<ListView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@ id/abcd" />
</FrameLayout>
Ниже приведен мой класс фрагментов, в котором я хочу показать входящие вместо вышеупомянутой активности.
public class AwayFragment extends Fragment {
public AwayFragment() {
// Required empty public constructor
}
static AwayFragment inst;
ArrayList<String> smsMessageList = new ArrayList<String>();
ListView smsListView;
ArrayAdapter arrayAdapter;
static AwayFragment instance() { return inst;}
@Override
public void onStart(){
super.onStart();
inst = this;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_away, container, false);
// Inflate the layout for this fragment
String[] awayStrings = {
"gas",
"cook",
"Sunset",
"MidMorning",
"Good Morning",
"Breakfast",
"MidMorning",
"Lunch",
"Afternoon",
"Sunset",
"Supper Time",
"Lunch",
"Afternoon",
"Supper Time",
"Lovely Night",
"Chilly Dreams"
};
ListView lv = (ListView) view.findViewById(R.id.listView2);
ArrayAdapter<String> lva = new ArrayAdapter<String>(
getActivity(), android.R.layout.simple_list_item_1, awayStrings);
lv.setAdapter(lva);
final SwipeRefreshLayout mSwipeRefreshLayout = (SwipeRefreshLayout)
view.findViewById(R.id.fragment_away);
mSwipeRefreshLayout.setOnRefreshListener(
() -> {
((MainActivity) getActivity()).refreshNow();
Toast.makeText(getContext(), "Refresh Layout working",
Toast.LENGTH_LONG).show();
}
);
return view;
}
public static class Way extends AppCompatActivity{
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[]
permissions, @NonNull int[] grantResults) {
if (requestCode == PERMISSIONS_REQUEST_READ_CONTACTS) {
if(grantResults[0] == PackageManager.PERMISSION_GRANTED){
showContacts();
}
} else{
Toast.makeText(this, "Grant kro be", Toast.LENGTH_LONG).show();
}
}
ListView listView;
private static final int PERMISSIONS_REQUEST_READ_CONTACTS = 100;
ArrayList<String> smsList;
private final String TAG = FetchingInboxActivity.class.getSimpleName();
public void showContacts() {
listView = (ListView) findViewById(R.id.listView2);
final String[] projection = new String[]{"*"};
Uri inboxUri = Uri.parse("content://mms-sms/conversations");
smsList = new ArrayList<>();
ContentResolver contentResolver = getContentResolver();
Cursor cursor = contentResolver.query(inboxUri, projection, null, null, null);
while (cursor.moveToNext()){
String number =
cursor.getString(cursor.getColumnIndexOrThrow("address")).toString();
String body =
cursor.getString(cursor.getColumnIndexOrThrow("body")).toString();
smsList.add("Number: " number "n" "Body: " body);
Log.d(TAG, "showcontacts: ");
}
cursor.close();
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, smsList);
listView.setAdapter(adapter);
}
}}
Наконец, фрагмент XML-файла:
<?xml version="1.0" encoding="utf-8"?>
<androidx.swiperefreshlayout.widget.SwipeRefreshLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@ id/fragment_away"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<ListView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@ id/listView2">
</ListView>
</androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
Ответ №1:
Допустим, это макет вашей деятельности
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<FrameLayout
android:id="@ id/fragmentContainer"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</androidx.constraintlayout.widget.ConstraintLayout>
А затем в вашей деятельности
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.setContentView(R.layout.activity_demo);
this.loadFragment(SMSListFragment())
}
private final void loadFragment(Fragment fragment) {
this.getSupportFragmentManager().beginTransaction().replace(R.id.fragmentContainer, fragment).commit();
}
Пожалуйста, ознакомьтесь с этим руководством по использованию фрагментов, затем вы можете переместить список и связанные с ним вещи во фрагмент.
Создание динамических пользовательских интерфейсов в Android с помощью фрагментов — Учебное пособие
Комментарии:
1. Я попробовал вышеупомянутый метод, но getSupportFragmentManager не работает!
2. @UtaibaNaqshbandi getFragmentManager() попробуйте с этим, возможно, вы используете библиотеку поддержки. Рассмотрите возможность использования новейшей библиотеки jetpack developer.android.com/jetpack/getting-started