【问题标题】:Let the user rename a button onlongclick event and save it让用户重命名一个按钮onlongclick事件并保存
【发布时间】:2026-01-16 06:20:09
【问题描述】:

我有 80 个按钮,用户必须能够通过长按事件重命名这些按钮并保存新的按钮文本。当用户关闭应用程序时,它必须保持相同的文本,并且不能回到默认文本。这就是我的第一个按钮。我将如何做到这一点,以便它知道哪个按钮被长按并重命名。 (这个编码出去的时候不保存)

public class MainActivity extends AppCompatActivity {

private Button btn1 , btn2 , btn3 , btn4 ;

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

    View.OnLongClickListener listener = new View.OnLongClickListener() {
        @Override
        public boolean onLongClick(View v) {
            showPopup(v);
            return true;    //Nothing shows error, but this part where i tried to set a onLongClick listener. 
        }
    };

    btn1.setOnLongClickListener(listener);
    btn2.setOnLongClickListener(listener);
    btn3.setOnLongClickListener(listener);
    btn4.setOnLongClickListener(listener);

    SharedPreferences prefs = getSharedPreferences("btnID", Context.MODE_PRIVATE);
    Map<String,?> keys = prefs.getAll();
    for(Map.Entry<String,?> entry : keys.entrySet()){
        Button button = (Button) findViewById(Integer.parseInt(entry.getKey()));
        button.setText(entry.getValue().toString());
    }

}


private void showPopup(View v) {
    //here you have your button
    final Button currentButton = (Button)v;
    v.setOnLongClickListener(new View.OnLongClickListener() {
        @Override
        public boolean onLongClick(View v) {
            showPopup(v);
            return true;
        }
    });


    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setTitle("Rename to?");
    View view = LayoutInflater.from(this).inflate(R.layout.dialog_view, null);
    final EditText edit_dialog = (EditText)view.findViewById(R.id.edit_dialog);

    edit_dialog.setText(currentButton.getText().toString());
    builder.setView(view);
    builder.setPositiveButton("confirm", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            currentButton.setText(edit_dialog.getText().toString());
            SharedPreferences prefs = getSharedPreferences("btnID", Context.MODE_PRIVATE);
            SharedPreferences.Editor editor = prefs.edit();
            editor.putString(String.valueOf(currentButton.getId()), currentButton.getText().toString());
            editor.apply();
        }


    });
    builder.show();
}

}

【问题讨论】:

    标签: android button


    【解决方案1】:

    您还必须传递按钮的 id,例如:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
        btn1 = (Button) findViewById(R.id.btn1);
        btn2 = (Button) findViewById(R.id.btn2);
        btn3 = (Button) findViewById(R.id.btn3);
        btn4 = (Button) findViewById(R.id.btn4);
    
        //HERE you load the button texts from SharedPrefs or SQLite and you set the text to the buttons from ids
    
        btn1.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View v) {
                    showDialog("", v.getId());
                return true;
            }
        });
    
    
    }
    
    private void showDialog(String str, int btnId) {
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setTitle("Rename to?");
        View view = LayoutInflater.from(this).inflate(R.layout.dialog_view, null);
        final EditText edit_dialog = (EditText) view.findViewById(R.id.edit_dialog);
        edit_dialog.setText(str);
        builder.setView(view);
        builder.setPositiveButton("confirm", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                btn1.setText(edit_dialog.getText().toString());
                //HERE you save the text and the relative id.
                //you can use both SharedPrefs or SQLite
            }
        });
        builder.show();
    }
    

    检查 cmets 以查看何时保存/加载数据

    如何使用单个onClickListener

    您必须自定义 onClick 方式来检索单击按钮的 id。您可以保存在 sharedPreferences 中

    private void showDialog(View v) {
        //here you have your button
        Button currentButton = (Button)v;
    
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setTitle("Rename to?");
        View view = LayoutInflater.from(this).inflate(R.layout.dialog_view, null);
        final EditText edit_dialog = (EditText)view.findViewById(R.id.edit_dialog);
        
        edit_dialog.setText(currentButton.getText().toString());
        builder.setView(view);
        builder.setPositiveButton("confirm", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                currentButton.setText(edit_dialog.getText().toString());
                SharedPreferences prefs = this.getSharedPreferences("sharedPrefName", Context.MODE_PRIVATE);
                SharedPreferences.Editor editor = prefs.edit();
                editor.putString(String.valueOf(currentButton.getId), currentButton.getText().toString());
                editor.apply();
            }
        });
        builder.show();
    }
    

    您可以在 xml 中使用 onclick 调用此方法:

    <Button
      android:id="@+id\myId"
      android:layout-width="wrap-content"
      android:layout-height="wrap-content"
      android:onclick="showDialog"
      />
    

    通过这种方式,您将能够对每个按钮使用一种方法。

    PS:

    您必须添加 onCreatesomething 来初始化按钮:

    SharedPreferences prefs = this.getSharedPreferences("sharedPrefName", Context.MODE_PRIVATE);
    Map<String,?> keys = prefs.getAll();
    for(Map.Entry<String,?> entry : keys.entrySet()){
      Button button = findViewById(Integer.Parse(entry.getHey()));
      button.setText(entry.getValue().toString());
    }
    

    对不起,如果它可能有任何错误,但我是手写的,所以我没有编译器。

    希望对你有帮助

    【讨论】:

    • @Bernard 对不起,我不在家,我编辑了答案,请看一下。关于安卓你需要了解什么?
    • @Bernard 抱歉,但我不明白你在说什么。编辑后的答案解决了原来的问题?在我们解决它之后,我们可以谈论其他事情:)
    • @Bernard 您可以在您的答案上发布(编辑)照片或代码。 SO上的文本区域顶部有一个img图标
    • @Bernard 抱歉我之前写错了,我的意思是编辑问题而不是答案,我的错。删除您的答案并在问题中添加代码:) 无论如何,问题是“悲伤的名字”,因为它已经存在。将其称为“showPopup”或您喜欢的方式,而不是 showDialog
    • @Bernard 是的,你必须重命名你的方法
    【解决方案2】:

    我也面临与@Bernard 相同的问题。然后我做了一些研究并将所有按钮的 ID 存储在一个数组中。我刚刚对@Pier Giorgio Misley 给出的解决方案进行了一些更改。非常感谢米斯利的帮助。我可以用你的解决方案解决这个问题。

        @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_home_page);
        setText();
    
        buttons = new ArrayList<Button>(BUTTON_IDS.length);
    
        SharedPreferences prefs = getSharedPreferences("btnID", Context.MODE_PRIVATE);
        Map<String,?> keys = prefs.getAll();
        for(Map.Entry<String,?> entry : keys.entrySet()){
            Button button = (Button) findViewById(Integer.parseInt(entry.getKey()));
            button.setText(entry.getValue().toString());
        }
    
        for(int id : BUTTON_IDS) {
            Button button = (Button)findViewById(id);
            button.setOnLongClickListener(new View.OnLongClickListener() {
                @Override
                public boolean onLongClick(View v) {
                    renameButton("",v);
                    return true;
                }
            });
    
        }
    }
    
    private void renameButton(String str,View v) {
        final Button currentButton = (Button)v;
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setTitle("Rename to?");
        View view = LayoutInflater.from(this).inflate(R.layout.dialog_view, null);
        final EditText edit_dialog = (EditText)view.findViewById(R.id.edit_text);
    
        edit_dialog.setText(str);
        builder.setView(view);
        builder.setPositiveButton("confirm", new DialogInterface.OnClickListener() {
    
            @Override
            public void onClick(DialogInterface dialog, int which) {
                currentButton.setText(edit_dialog.getText().toString());
                SharedPreferences prefs = getSharedPreferences("btnID", Context.MODE_PRIVATE);
                SharedPreferences.Editor editor = prefs.edit();
                editor.putString(String.valueOf(currentButton.getId()), currentButton.getText().toString());
                editor.apply();
            }
        });
        builder.show();
    }
    

    在onCreate方法上面创建一个按钮ID数组,

         private List<Button> buttons;
    private static final int[] BUTTON_IDS = {
            R.id.btn1,
            R.id.btn2,
            R.id.btn3,
            R.id.btn4,
    };
    

    【讨论】: